确定dp数组以及下标的含义

dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。

出现冷冻期之后,状态其实比较复杂,例如今天买入股票、今天卖出股票、今天是冷冻期

具体可以区分出如下四个状态:

0:状态一:买入股票状态(今天买入股票,或者是之前就买入了股票然后没有操作)
卖出股票状态,这里细分就有两种卖出股票状态
1:状态二:两天前就卖出了股票,度过了冷冻期,一直没操作,今天保持卖出股票状态
2:状态三:今天卖出了股票
3:状态四;今天为冷冻期状态,但冷冻期状态不可持续,只有一天!

注意这里的每一个状态,例如状态一,是买入股票状态并不是说今天已经就买入股票,而是说保存买入股票的状态即:可能是前几天买入的,之后一直没操作,所以保持买入股票的状态。

确定递推公式

达到买入股票状态(状态一)即:dp[i][0],有两个具体操作:

操作一:前一天就是持有股票的情况(状态一),dp[i][0] = dp[i - 1][0]
操作二:今天买入了的情况,细分有两种:

1、前一天是冷冻期(状态四),dp[i - 1][3] - prices[i]
2、前一天是保持已卖出股票状态(状态二),dp[i - 1][1] - prices[i] (不能是刚好卖出状态(状态三))
所以操作二取最大值,即:max*(* dp[i - 1][3], dp[i - 1][1] *)*- prices[i]

那么dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3], dp[i - 1][1]) - prices[i]);

达到保持已卖出股票状态(状态二)即:dp[i][1],有两个具体操作:

操作一:前一天就是已卖出状态dp[ii][1]=dp[ii-1][1];
操作二:前一天是冷冻期(状态四) dp[i][1] = max(dp[i - 1][1], dp[i -1][3]);

达到今天就卖出股票状态(状态三),即:dp[i][2] ,只有一个操作:

昨天一定是买入股票状态(状态一),今天卖出 即:dp[i][2] = dp[i - 1][0] + prices[i];

达到冷冻期状态(状态四),即:dp[i][3],只有一个操作:

昨天卖出了股票(状态三) p[i][3] = dp[i - 1][2];

综上分析,递推代码如下:

dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3], dp[i - 1][1]) - prices[i];
dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
dp[i][2] = dp[i - 1][0] + prices[i];
dp[i][3] = dp[i - 1][2];

dp数组如何初始化

这里主要讨论一下第0天如何初始化。

如果是持有股票状态(状态一)那么:dp[0][0] = -prices[0],买入股票所省现金为负数。

保持卖出股票状态(状态二),第0天没有卖出dp[0][1]初始化为0就行,

今天卖出了股票(状态三),同样dp[0][2]初始化为0,因为最少收益就是0,绝不会是负数。

同理dp[0][3]也初始为0。

确定遍历顺序

从递归公式上可以看出,dp[i] 依赖于 dp[i-1],所以是从前向后遍历。

举例推导dp数组

以 [1,2,3,0,2] 为例,dp数组如下

时间复杂度:O(n)
空间复杂度:O(n)
class Solution {public:int maxProfit(vector<int>& prices) {if(prices.size()<=1) return 0;vector<vector<int>> dp(prices.size(),vector<int>(4,0));dp[0][0]=-prices[0];dp[0][1]=0;dp[0][2]=0;dp[0][3]=0;for(int ii=1;ii<prices.size();ii++){//持有股票状态 //1、今天买入了:前一天是冷冻期【3】前一天是保持卖出股票状态【1】//不能为2是因为卖出状态【2】的话,今天一定是不能买的//2、前一天就是持有股票状态0//(max(前一天为冻窗期,前一天卖出股票),前一天就是持有股票状态)dp[ii][0]=max(max(dp[ii-1][3],dp[ii-1][1])-prices[ii],dp[ii-1][0]);/*达到保持卖出股票状态1*/dp[ii][1]=max(dp[ii-1][3],dp[ii-1][1]); /*达到今天卖出股票状态2*/dp[ii][2]=dp[ii-1][0]+prices[ii];/*达到冷冻期状态*/dp[ii][3]=dp[ii-1][2];//昨天卖出了股票}return max(max(dp[prices.size()-1][2],dp[prices.size()-1][1]),dp[prices.size()-1][3]);}
};

另一种解法

class Solution {public:int maxProfit(vector<int>& prices) {if(prices.size()<=1) return 0;vector<vector<int>> dp(prices.size(),vector<int>(4));dp[0][0]=0;dp[0][1]=-prices[0];dp[0][2]=0;dp[0][3]=0;for(int ii=1;ii<prices.size();ii++){dp[ii][0]=dp[ii-1][0];dp[ii][1]=max(dp[ii-1][1],dp[ii-1][3]-prices[ii]);dp[ii][2]=max(dp[ii-1][2],dp[ii-1][1]+prices[ii]);dp[ii][3]=dp[ii-1][2];}return max(dp[prices.size()-1][3],dp[prices.size()-1][2]);}
};

最佳买卖股票时机含冷冻期相关推荐

  1. leetcode 309. Best Time to Buy and Sell Stock with Cooldown | 309. 最佳买卖股票时机含冷冻期(动态规划)

    题目 https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/ 题解 我知道要dp,但是不知道要怎么dp ...

  2. 【LeetCode】309. Best Time to Buy and Sell Stock with Cooldown 最佳买卖股票时机含冷冻期(Medium)(JAVA)

    [LeetCode]309. Best Time to Buy and Sell Stock with Cooldown 最佳买卖股票时机含冷冻期(Medium)(JAVA) 题目地址: https: ...

  3. leetcode 最佳买卖股票时机含冷冻期(Java)

    leetcode题目 最佳买卖股票时机含冷冻期 -- leetcode 309 题目描述 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 .​设计一个算法计算出最大利润.在满足以下约束 ...

  4. LeetCode 309. 最佳买卖股票时机含冷冻期 | Python

    文章目录 309. 最佳买卖股票时机含冷冻期 题目 解题思路 代码实现 实现结果 欢迎关注 309. 最佳买卖股票时机含冷冻期 题目来源:力扣(LeetCode)https://leetcode-cn ...

  5. Java实现 LeetCode 309 最佳买卖股票时机含冷冻期

    309. 最佳买卖股票时机含冷冻期 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 .​ 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股 ...

  6. LeetCode:309. 最佳买卖股票时机含冷冻期(python)

    LeetCode:309. 最佳买卖股票时机含冷冻期(python) 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能 ...

  7. 【必备算法】动态规划:LeetCode题(九)309. 最佳买卖股票时机含冷冻期,714. 买卖股票的最佳含手续费

    买卖股票系列: [必备算法]动态规划:一个思路解决六道股票问题 [必备算法]动态规划:LeetCode题(七)121. 买卖股票的最佳时机,122. 买卖股票的最佳时机 II [必备算法]动态规划:L ...

  8. 算法训练第五十一天 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、股票问题总结

    动态规划part12 309.最佳买卖股票时机含冷冻期 题目描述 思路 总结 714.买卖股票的最佳时机含手续费 题目描述 思路 股票问题总结 309.最佳买卖股票时机含冷冻期 题目链接:309.最佳 ...

  9. (dp) 力扣309. 最佳买卖股票时机含冷冻期 思路

    题目链接309. 最佳买卖股票时机含冷冻期 这一题的思路是在原本买卖股票的基础上添加一个冷冻期,即为修改dp条件.先贴出代码: class Solution {public:int maxProfit ...

  10. 力扣-309最佳买卖股票时机含冷冻期(dp)

    力扣-309最佳买卖股票时机含冷冻期 1.题目 309. 最佳买卖股票时机含冷冻期 给定一个整数数组prices,其中第 prices[i] 表示第i天的股票价格 . 设计一个算法计算出最大利润.在满 ...

最新文章

  1. 开源大数据周刊-第30期
  2. VS2013 编译程序时提示 无法查找或打开 PDB 文件
  3. php+当前+日期+函数是,php时间日期的处理函数
  4. php网站鼠标美化,安装鼠标主题 - 让ubuntu的鼠标变得更加漂亮【鼠标指针主题包】...
  5. 论文重复率太高咋办?Python来帮你解决
  6. Unity 无法识别视频
  7. 软件安装(二)---PDF打印机安装设置
  8. 【数据结构和算法】爆肝三万字你必须知道的20个解决问题的技巧
  9. 金融信创爆发年,优炫数据库高可用高性能解决方案
  10. 编写一程序,将两个字符串连接起来,结果取代第一个字符串。(三种方法)
  11. win10 labelme 使用记录
  12. mybatis与mysql时间总是慢8小时
  13. php header 生成pdf,使用PHP生成PDF文档
  14. 实验吧CTF练习题---WEB---猫抓老鼠解析
  15. TOPSIS算法(优劣解距离法)的使用举例与matlab实现
  16. 年轻人,请听我说……
  17. ArcGIS坡度的提取
  18. 【愚公系列】2022年02月 微信小程序-Component组件的扩展
  19. 关于毕业设计的总结与思考
  20. 移动营业厅称部分SIM卡无法用于iPhone4S

热门文章

  1. C#操作项目配置文件
  2. 谨慎用药!这些药千万不能混在一起吃
  3. 分块查询 缓解内存开销
  4. PHP-代码审计-文件上传
  5. 算法知识之最长公共子序列问题(动态规划)
  6. 【数据结构与算法】之深入解析“零钱兑换”的求解思路与算法示例
  7. 【Linux】一步一步学Linux——apt-get命令(278)
  8. 【Linux】一步一步学Linux——umask命令(111)
  9. 【Ubuntu】 Ubuntu16.04快速搭建环境
  10. java 2d 绘图教程_Java标准教程:Java 2D绘图--第2章 从绘图开始