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 @ 2022-04-07 15:06  北原春希  阅读(27)  评论(0编辑  收藏  举报