代码随想录算法训练营day41|动态规划买卖股票问题

今天的三题买卖股票问题,实际上解题方法都大同小异,思路也和昨天的树形dp有相似之处,都是用一个dp数组的不同下标来记录不同的状态。其中第一题是只买卖一次,可以用贪心的方法,找出左边的最小值和右边的最大值,相减即可最大利润。如果用动态规划的方法,则分别用0和1来表示持有股票和不持有股票,dp[i][0]和dp[i][1]表示当前拥有的现金,则持有股票就减去price[i],卖出股票就加上price[i],又因为这题只卖出一次,所以可以列出如下方程:

复制代码
            dp[i][0] = max(dp[i - 1][0], -prices[i]);
            dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);

第二题与第一题的区别在于买卖次数没有限制,则方程应更改为下图:

复制代码
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]-price[i]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0]+price[i]);

同时第二题也可以使用贪心,将每次买卖都拆解开,

复制代码
interest=price[3]-price[2]+price[2]-price[1]+price[1]-price[0]

所以将正数部分累加即可得到最大值。

第三题与第一题的区别在于买卖次数上限改为两次,不好用贪心。考虑dp代码如下:

复制代码
            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]);

注意到每一次的状态只跟前一次有关,所以可以进行降维处理,这里卡哥采用正序遍历,我觉得类似一维01背包的倒序遍历更好理解:

复制代码
            dp[4]=max(dp[4],dp[3]+prices[i]); 
            dp[3]=max(dp[3],dp[2]-prices[i]);   
            dp[2]=max(dp[2],dp[1]+prices[i]);
            dp[1]=max(dp[1],-prices[i]);

采用倒序遍历保证每一次的数值在计算前不会被覆盖

相关推荐
计算机安禾4 分钟前
【数据结构与算法】第10篇:项目实战:学生信息管理系统(线性表版)
开发语言·数据结构·算法·visual studio
q_35488851534 分钟前
计算机毕业设计:汽车数据可视化与智能分析平台 Django框架 Scrapy爬虫 可视化 车辆 懂车帝大数据 数据分析 机器学习(建议收藏)✅
算法·信息可视化·django·flask·汽车·课程设计·美食
FakeOccupational25 分钟前
【电路笔记 通信】IEEE 1588精密时间协议(PTP):数学假设+时间同步链路建模+消除主从偏差算法
笔记·算法
客卿12325 分钟前
最小生成树(贪心)--构造回文串(字符串 + 回文判断 + 构造)
java·开发语言·算法
88号技师30 分钟前
2026年3月中科院一区SCI-赏金猎人优化算法Bounty Hunter Optimizer-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
再卷也是菜37 分钟前
算法基础篇(12)Trie树
算法·字典树
小糯米6011 小时前
C++ 单调栈原理与模板
开发语言·c++·算法
常利兵1 小时前
Android 集合探秘:ArrayMap 与 SparseArray 的奇妙之旅
android·算法·哈希算法
滴滴答滴答答1 小时前
LeetCode Hot100 之 41 缺失的第一个正数
算法·leetcode·职场和发展
rgb2gray1 小时前
论文详解:基于POI与出租车轨迹的城市多中心结构静态-动态多重分形特征
人工智能·python·算法·机器学习·数据分析·可解释