309. 最佳买卖股票时机含冷冻期
✅做题思路or感想
这一题不能用状态的方法去思考,会很绕。只关注卖出的那一天就好了
这里的处理是把冷冻期放进了dp[i][0]
中一并考虑了
dp数组含义
0.不持股且当天没卖出,定义其最大收益dp[i][0]
;
1.持股,定义其最大收益dp[i][1]
;
2.不持股且当天卖出了,定义其最大收益dp[i][2]
;
推导公式
//可能是前一天就不持有股票,也可能是昨天卖了股票,今天进入了冷冻期
dp[i][0] = max(dp[i - 1][0], dp[i - 1][2]);
//可能是前一天就有股票,也可能是今天刚刚买
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
//这个有含义知,肯定只有一种情况:今天卖股票
dp[i][2] = dp[i - 1][1] + prices[i];
初始化
dp[0][0] = 0; //什么也没干
dp[0][1] = -prices[0]; //第一天就买股票
dp[0][2] = 0; //买了股票后又买了
遍历顺序
从小推大,所以是正序
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>>dp (prices.size(), vector<int>(4, 0));
//0.不持股且当天没卖出,定义其最大收益dp[i][0];
//1.持股,定义其最大收益dp[i][1];
//2.不持股且当天卖出了,定义其最大收益dp[i][2];
dp[0][0] = 0;
dp[0][1] = -prices[0];
dp[0][2] = 0;
for (int i = 1; i < prices.size(); i++) {
dp[i][0] = max(dp[i - 1][0], dp[i - 1][2]);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
dp[i][2] = dp[i - 1][1] + prices[i];
}
return max(dp[prices.size() - 1][0], dp[prices.size() - 1][2]);
}
};