代码随想录Day55 | 股票买卖
309.最佳买卖股票时机含冷冻期
文档讲解:代码随想录
视频讲解: 动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期
状态
增加冷冻期后状态又发生了改变,相当于一天可能又4种状态
持有股票
今天卖出股票
冷冻期
未持有股票
- dp数组 和 递推公式
所以dp数组的应该这样来写
vector<vector<int>> dp(len,vector<int>(4))
dp[i][0] 就表示第i天持有股票的状态,其可能是之前就持有,或者今天买入,而对于买入由于考虑冷冻期,所以要么前一天是冷冻期,要么前一天是没持有股票
dp[i][0] = max(dp[i-1][0],dp[i-1][2]-prices[i],dp[i-1][3]-prices[i]);
dp[i][1] 表示第i天卖出股票的状态,那么就是前一天持有股票的.
dp[i][1] = dp[i-1][0]+prices[i];
dp[i][2] 表示第i天是冷冻期,说明前一天为卖出股票状态
dp[i][2] = dp[i-1][1];
dp[i][3] 表示第i天使未持有股票状态,那么说明之前未持有,或者前一天是冷冻期
dp[i][3] = max(dp[i-1][3],dp[i-1][2]);
- 初始化
dp[0][0] = -prices[0]
dp[0][1] = 0
dp[0][2] = 0
dp[0][3] = 0 - 遍历顺序
从前向后 - 打印dp
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
if(len <= 1) return 0;
vector<vector<int>> dp(len,vector<int>(4));
dp[0][0] = -1*prices[0];
dp[0][1] = 0;
dp[0][2] = 0;
dp[0][3] = 0;
for(int i=1;i<len;i++)
{
dp[i][0] = max(dp[i-1][0],max(dp[i-1][2]-prices[i],dp[i-1][3]-prices[i]));
dp[i][1] = dp[i-1][0]+prices[i];
dp[i][2] = dp[i-1][1];
dp[i][3] = max(dp[i-1][3],dp[i-1][2]);
}
//最大利润一定是卖出情况
int maxval = max(dp[len-1][1],max(dp[len-1][2],dp[len-1][3]));
return maxval;
}
};
714.买卖股票的最佳时机含手续费
文档讲解:代码随想录
视频讲解: 动态规划来决定最佳时机,这次含手续费!| LeetCode:714.买卖股票的最佳时机含手续费
状态
在买入到卖出期间只需要付一次手续费.
- dp数组的含义
dp[i][0] 表示第i天未持有股票的最大利润
dp[i][1] 表示第i天持有股票的最大利润 - 递推公式
dp[i][0] 可以是前一天就未持有或者今天卖出(扣除手续费)
dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]-fee);
dp[i][1] 可以是今天买入不包含手续费或者之前就买入
dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i]);
- 初始化
dp[0][0] = 0;
dp[0][1] = -prices[0] - 遍历顺序
从前向后 - 打印dp
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int len = prices.size();
if(len <= 1) return 0;
vector<vector<int>> dp(len,vector<int>(2));
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i = 1;i<len;i++)
{
dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]-fee);
dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i]);
}
//因为含手续费
int maxval = max(dp[len-1][0],dp[len-1][1]);
return maxval;
}
};
文章讲述了使用动态规划方法解决股票买卖问题,涉及冷冻期限制和手续费计算。第一个问题中,考虑了冷冻期对持有状态的影响;第二个问题则加入了手续费,更新了dp数组状态和递推公式。
945

被折叠的 条评论
为什么被折叠?



