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]);
    }
};
posted @   北原春希  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示