最佳买卖股票时机含冷冻期
确定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]);}
};
最佳买卖股票时机含冷冻期相关推荐
- 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 ...
- 【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: ...
- leetcode 最佳买卖股票时机含冷冻期(Java)
leetcode题目 最佳买卖股票时机含冷冻期 -- leetcode 309 题目描述 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 .设计一个算法计算出最大利润.在满足以下约束 ...
- LeetCode 309. 最佳买卖股票时机含冷冻期 | Python
文章目录 309. 最佳买卖股票时机含冷冻期 题目 解题思路 代码实现 实现结果 欢迎关注 309. 最佳买卖股票时机含冷冻期 题目来源:力扣(LeetCode)https://leetcode-cn ...
- Java实现 LeetCode 309 最佳买卖股票时机含冷冻期
309. 最佳买卖股票时机含冷冻期 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股 ...
- LeetCode:309. 最佳买卖股票时机含冷冻期(python)
LeetCode:309. 最佳买卖股票时机含冷冻期(python) 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能 ...
- 【必备算法】动态规划:LeetCode题(九)309. 最佳买卖股票时机含冷冻期,714. 买卖股票的最佳含手续费
买卖股票系列: [必备算法]动态规划:一个思路解决六道股票问题 [必备算法]动态规划:LeetCode题(七)121. 买卖股票的最佳时机,122. 买卖股票的最佳时机 II [必备算法]动态规划:L ...
- 算法训练第五十一天 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、股票问题总结
动态规划part12 309.最佳买卖股票时机含冷冻期 题目描述 思路 总结 714.买卖股票的最佳时机含手续费 题目描述 思路 股票问题总结 309.最佳买卖股票时机含冷冻期 题目链接:309.最佳 ...
- (dp) 力扣309. 最佳买卖股票时机含冷冻期 思路
题目链接309. 最佳买卖股票时机含冷冻期 这一题的思路是在原本买卖股票的基础上添加一个冷冻期,即为修改dp条件.先贴出代码: class Solution {public:int maxProfit ...
- 力扣-309最佳买卖股票时机含冷冻期(dp)
力扣-309最佳买卖股票时机含冷冻期 1.题目 309. 最佳买卖股票时机含冷冻期 给定一个整数数组prices,其中第 prices[i] 表示第i天的股票价格 . 设计一个算法计算出最大利润.在满 ...
最新文章
- 开源大数据周刊-第30期
- VS2013 编译程序时提示 无法查找或打开 PDB 文件
- php+当前+日期+函数是,php时间日期的处理函数
- php网站鼠标美化,安装鼠标主题 - 让ubuntu的鼠标变得更加漂亮【鼠标指针主题包】...
- 论文重复率太高咋办?Python来帮你解决
- Unity 无法识别视频
- 软件安装(二)---PDF打印机安装设置
- 【数据结构和算法】爆肝三万字你必须知道的20个解决问题的技巧
- 金融信创爆发年,优炫数据库高可用高性能解决方案
- 编写一程序,将两个字符串连接起来,结果取代第一个字符串。(三种方法)
- win10 labelme 使用记录
- mybatis与mysql时间总是慢8小时
- php header 生成pdf,使用PHP生成PDF文档
- 实验吧CTF练习题---WEB---猫抓老鼠解析
- TOPSIS算法(优劣解距离法)的使用举例与matlab实现
- 年轻人,请听我说……
- ArcGIS坡度的提取
- 【愚公系列】2022年02月 微信小程序-Component组件的扩展
- 关于毕业设计的总结与思考
- 移动营业厅称部分SIM卡无法用于iPhone4S
热门文章
- C#操作项目配置文件
- 谨慎用药!这些药千万不能混在一起吃
- 分块查询 缓解内存开销
- PHP-代码审计-文件上传
- 算法知识之最长公共子序列问题(动态规划)
- 【数据结构与算法】之深入解析“零钱兑换”的求解思路与算法示例
- 【Linux】一步一步学Linux——apt-get命令(278)
- 【Linux】一步一步学Linux——umask命令(111)
- 【Ubuntu】 Ubuntu16.04快速搭建环境
- java 2d 绘图教程_Java标准教程:Java 2D绘图--第2章 从绘图开始