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

【c++刷题笔记-动态规划】day41: 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II 、

121. 买卖股票的最佳时机 - 力扣(LeetCode)

思路:两个状态,前i-1天持有和第i天买入-prices[i]比较。

           前i-1天没买入保持现状和第i天卖出dp[i-1][0]+prices[i]比较

重点: dp[i][0]=max(dp[i-1][0],-prices[i]);
            dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]);

class Solution {
public:int maxProfit(vector<int>& prices) {int n=prices.size();vector<vector<int>>dp(n,vector<int>(2,0));//dp[i][0]表示持有,dp[i][1]表示不持有dp[0][0]=-prices[0];//第一天持有,一定是第一天买入的for(int i=1;i<n;i++){dp[i][0]=max(dp[i-1][0],-prices[i]);//前i-1天持有和第i天买入-prices[i]比较dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]);//前i-1天没买入保持现状和第i天卖出dp[i-1][0]+prices[i]比较}return dp[n-1][1];}
};

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

思路:前i-1天持有和前i-1天不持有今天买入dp[i][1]-prices[i]比较

           前i-1天没买入保持现状和前i-1天买入今天卖出dp[i][0]+prices[i]比较

重点:dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);
            dp[i][1]=max(dp[i-1][1],dp[i][0]+prices[i]);

class Solution {
public:int maxProfit(vector<int>& prices) {int n=prices.size();vector<vector<int>>dp(n,vector<int>(2,0));//dp[i][0]表示持有所得现金,dp[i][1]表示不持有所得现金dp[0][0]=-prices[0];//第一天持有,一定是第一天买入的for(int i=1;i<n;i++){dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);//前i-1天持有和前i-1天不持有今天买入dp[i][1]-prices[i]比较dp[i][1]=max(dp[i-1][1],dp[i][0]+prices[i]);//前i-1天没买入保持现状和前i-1天买入今天卖出dp[i][0]+prices[i]比较}return dp[n-1][1];}
};

123. 买卖股票的最佳时机 III - 力扣(LeetCode)

思路:五个状态

  1. 没有操作 (可以不设置这个状态)
  2. 第一次持有股票
  3. 第一次不持有股票
  4. 第二次持有股票
  5. 第二次不持有股票

重点: dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);//第一次持有
            dp[i][2]=max(dp[i-1][2],dp[i-1][1]+prices[i]);//第一次卖出
            dp[i][3]=max(dp[i-1][3],dp[i-1][2]-prices[i]);//第二次持有
            dp[i][4]=max(dp[i-1][4],dp[i-1][3]+prices[i]);//第二次卖出

class Solution {
public:int maxProfit(vector<int>& prices) {int n=prices.size();vector<vector<int>>dp(n,vector<int>(5,0));dp[0][1]=dp[0][3]=-prices[0];//第一次买入和第二次买入第一天for(int i=1;i<n;i++){dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);//第一次持有dp[i][2]=max(dp[i-1][2],dp[i-1][1]+prices[i]);//第一次卖出dp[i][3]=max(dp[i-1][3],dp[i-1][2]-prices[i]);//第二次持有dp[i][4]=max(dp[i-1][4],dp[i-1][3]+prices[i]);//第二次卖出}return dp[n-1][4];}
};

总结

两个状态,持有和不持有。持有是前几天买入没有卖出的状态和今天刚刚买入的状态。不持有是前几天卖出和今天卖出的状态。dp数组初始化第一天持有就一定是第一天买入的。今天依赖前几天的状态取最大值。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Perl之正则表达式
  • 【数学建模】技术革新——Lingo的使用超详解
  • 基于Go1.19的站点模板爬虫
  • Vue2中的指令修饰符
  • Linux系统下weblogic10.3.6版本打补丁步骤
  • 最新版康泰克完整版- Kontakt v7.10.5 for Win和Mac,支持m芯片和intel,有入库工具
  • flutter 手写 TabBar
  • 鸿蒙开发:Universal Keystore Kit(密钥管理服务)【查询密钥是否存在(ArkTS)】
  • 东软医疗 踩在中国医疗科技跃迁的风口上
  • 【unity实战】使用unity制作一个红点系统
  • 文件安全传输系统,如何保障信创环境下数据的安全传输?
  • docker 安装 onlyoffice
  • CentOS 7 中出现 cannot open Packages database in /var/lib/rpm 错误
  • 最新PHP自助商城源码,彩虹商城源码
  • kettle从入门到精通 第七五课 ETL之kettle血缘,数据血缘
  • 时间复杂度分析经典问题——最大子序列和
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • iOS | NSProxy
  • Python打包系统简单入门
  • QQ浏览器x5内核的兼容性问题
  • 大整数乘法-表格法
  • 基于 Babel 的 npm 包最小化设置
  • 类orAPI - 收藏集 - 掘金
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端存储 - localStorage
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 小而合理的前端理论:rscss和rsjs
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • #{} 和 ${}区别
  • (1)Jupyter Notebook 下载及安装
  • (14)Hive调优——合并小文件
  • (52)只出现一次的数字III
  • (C++20) consteval立即函数
  • (LeetCode 49)Anagrams
  • (笔记)M1使用hombrew安装qemu
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十三)MipMap
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)模仿学习-完成后台管理页面查询
  • (五)MySQL的备份及恢复
  • (一)插入排序
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .form文件_SSM框架文件上传篇
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net的socket示例
  • .NET构架之我见
  • .NET上SQLite的连接
  • .Net中wcf服务生成及调用
  • /var/lib/dpkg/lock 锁定问题
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [ 转载 ] SharePoint 资料
  • []sim300 GPRS数据收发程序