这里将 “ 当天卖出” 单独拿出来,是因为本题存在冷冻期,而冷冻期的前一天是当天卖出的状态。如果不单独拿出来的话,那么冷冻期的前一天就是 不持有股票的状态,不持有股票有两种状态,这里就无法做出准确的区分了。
class Solution {
public:
int maxProfit(vector<int>& prices) {
/*
四种有状态
0.持有
之前就持有
当天买入
前一天是冷冻期
前一天不持有股票
1.不持
之前不持有
前一天是冷冻期(为什么不是今天卖出呢?是因为当天卖出已经单独被列出来了吗
2.当天卖出
之前持有
3.冷冻
昨天卖出
*/
vector<vector<int>> dp(prices.size(), vector<int>(4));
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = 0;
dp[0][3] = 0;
for(int i = 1; i < prices.size(); i++)
{
dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]));
dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
dp[i][2] = dp[i - 1][0] + prices[i];
dp[i][3] = dp[i - 1][2];
}
return max(dp[prices.size() - 1][3], max(dp[prices.size() - 1][1], dp[prices.size() - 1][2]));
}
};