最佳买卖股票时机含冷冻期
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/
题目描述:
题解:
非状态机的DP讲解题解
class Solution {
public:
int maxProfit(vector<int>& prices) {
//dp[i][0]:第i天手上不持有股票的最大收益
//dp[i][1]:第i天手上持有股票的最大收益
//dp[i][2]:第i天卖出了股票导致手上不持有股票的最大收益
vector<vector<int>> dp(prices.size(), vector<int>(3, 0));
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]); //第i天不持股的两种情况:1.第i-1天不持股。2.第i-1天卖出了股票,第i天为冷冻期
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]); //第i天持股的两种情况:1.第i- 1天持股。2.第i天买入股票(第i-1天一定不持股且当天未卖股票)
dp[i][2] = dp[i - 1][1] + prices[i]; //第i天卖出股票导致手上不持股,则第i-1天手上一定持股
}
//最后一天的最大收益有两种可能,而且一定是“不持有”状态下的两种可能。
return max(dp[prices.size() - 1][0], dp[prices.size() - 1][2]);
}
};