当前位置: 首页 > news >正文

[Algorithm][综合训练][拜访][买卖股票的最好时机(四)]详细讲解

目录

  • 1.拜访
    • 1.题目链接
    • 2.算法原理详解 && 代码实现
  • 2.买卖股票的最好时机(四)
    • 1.题目链接
    • 2.算法原理详解 && 代码实现


1.拜访

1.题目链接

  • 拜访

2.算法原理详解 && 代码实现

  • 说明:单纯积累一下这种模型 -> 最短路 并 维护最短路的数量

  • 解法:单源最短路 -> BFS

    • dist[][]:用于标记最短距离和是否走过该点
    • cnt[][]:用于记录走到此处为最短距离时的方案个数
      请添加图片描述
    class Solution 
    {int n, m;int x1, y1, x2, y2;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};vector<vector<int>> dist;vector<vector<int>> cnt;public:int countPath(vector<vector<int>>& CityMap, int _n, int _m) {n = _n, m = _m;dist.resize(n, vector<int>(m, -1));cnt.resize(n, vector<int>(m, 0));for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(CityMap[i][j] == 1){x1 = i, y1 = j;}else if(CityMap[i][j] == 2){x2 = i, y2 = j;}}}return BFS(CityMap);}int BFS(vector<vector<int>>& CityMap){queue<pair<int, int>> q;q.push({x1, y1});dist[x1][y1] = 0;cnt[x1][y1] = 1;while(q.size()){auto [a, b] = q.front();q.pop();for(int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if(x >= 0 && x < n && y >= 0 && y < m && CityMap[x][y] != -1){if(dist[x][y] == -1) // 第⼀次到这个位置{dist[x][y] = dist[a][b] + 1;cnt[x][y] = cnt[a][b];q.push({x, y});}else // 不是第一次{if(dist[a][b] + 1 == dist[x][y]) // 是否是最短路{cnt[x][y] += cnt[a][b];}}}}}return cnt[x2][y2];}
    };
    

2.买卖股票的最好时机(四)

1.题目链接

  • 买卖股票的最好时机(四)

2.算法原理详解 && 代码实现

  • 细节:可能k > n / 2,此时开空间时,会多开很多无意义的空间
    • 此时k = min(k, n / 2)可以解决该问题
  • 解法
    • 状态表示:第i天结束之后,所能获得的最大利润

      • f[i][j]:第i天结束之后,完成了j次交易,处于“买入”状态,此时的最大利润
      • g[i][j]:第i天结束之后,完成了j次交易,处于“卖出”状态,此时的最大利润
        请添加图片描述
    • 状态转移方程:本题关系复杂,可以画图辅助

      • f[i][j] = max(f[i - 1][j], g[i - 1][j] - p[i])
      • g[i][j] = max(g[i - 1][j], f[i - 1][j - 1] + p[i])
        • 初始化时,只有g需要特殊处理第一列,而f并不需要
        • 为了避免这种情况,可以将这个状态方程拆成多步,分步执行
          • g[i][j] = g[i - 1][j]
          • if(j - 1 >= 0) g[i][j] = max(g[i][j], f[i - 1][j - 1] + p[i])
            请添加图片描述
    • 初始化
      请添加图片描述

    • 返回值g[n - 1]中的最大值

    #include <iostream>
    #include <vector>
    using namespace std;const int INF = -0x3f3f3f3f;int main()
    {int n = 0, k = 0;cin >> n >> k;k = min(k, n / 2); // 优化处理细节,避免空间浪费vector<int> prices(n, 0);for(auto& x : prices){cin >> x;}vector<vector<int>> f(n, vector<int>(k + 1, INF));vector<vector<int>> g(n, vector<int>(k + 1, INF));f[0][0] = -prices[0], g[0][0] = 0;for(int i = 1; i < n; i++){for(int j = 0; j <= k; j++){f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);// 避免越界g[i][j] = g[i - 1][j];if(j - 1 >= 0){g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);}}}int ret = 0;for(int i = 0; i <= k; i++){ret = max(ret, g[n - 1][i]);}cout << ret << endl;return 0;
    }
    

相关文章:

  • 第四章 Java核心类库 第四节 异常处理
  • 重头开始嵌入式第三十天(Linux系统编程 ip头)
  • 骨灵冷火!Solon Cloud Gateway 照面发布
  • rabbitmq高可用集群搭建
  • 【软件测试专栏】软件测试 — 用例篇
  • docker 启动ElasticSearch
  • 小程序的页面跳转方式
  • 【go-zero】goctl笔记
  • FastAPI 进阶:使用 Pydantic 验证器增强 Query 参数验证
  • 汽车功能安全--TC3xx SMU之看门狗alarm处理
  • C语言操作符详解1(含进制转换,原反补码)
  • edge跟谷歌浏览器配置浏览器可跨域
  • SecurityHeaders:为.Net网站添加安全标头,让Web更加安全、避免攻击!
  • Quartz.Net_侦听触发器
  • C语言典型例题59
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Java多态
  • Java反射-动态类加载和重新加载
  • JS实现简单的MVC模式开发小游戏
  • LeetCode18.四数之和 JavaScript
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • SegmentFault 2015 Top Rank
  • sessionStorage和localStorage
  • tab.js分享及浏览器兼容性问题汇总
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 从重复到重用
  • 你真的知道 == 和 equals 的区别吗?
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 思考 CSS 架构
  • 通过npm或yarn自动生成vue组件
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 用jQuery怎么做到前后端分离
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #QT(智能家居界面-界面切换)
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2022 CVPR) Unbiased Teacher v2
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (JS基础)String 类型
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (回溯) LeetCode 131. 分割回文串
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • .gitignore文件使用
  • .Net CF下精确的计时器