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]);
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端