分析:这题同前题类似,只是加了一个冷冻期为1天。
1.dp数组定义
dp[i][0] 表示第i天交易完后,有股票的最大收益。
dp[i][1] 表示第i天交易完后,没股票,且在冷冻期的最大收益。
dp[i][2] 表示第i天交易完后,没股票,不在冷冻期的最大收益。
2.状态转移方程
dp[i][0] = max(dp[i-1][0],dp[i-1][2]-price[i])
分析:
dp[i][0] 可能由下面两个状态转移而来:
- 第i-1天仍有股票。
- 第i-1天没有股票,且不在冷冻期,第i天买入了股票。
dp[i][1] = dp[i-1][0]+price[i]
- dp[i][1] 只能是第i-1天有股票,第i天卖出,进入冷冻期。
dp[i][2] = max(dp[i-1][2],dp[i-1][1])
分析:dp[i][2]表示表示第i天交易完后,没股票,不在冷冻期。只可能是第i-1天仍为没股票,不在冷冻期。或者是第i-1天没股票,在冷冻期。过了一天退出冷冻期了。
3.初始化:
dp[0][0] = -price[i] 第0天持有股票,故为 -price[i]
dp[0][1] = 0;
dp[0][2] = 0;
返回值为max(dp[n-1][2],dp[n-1][2])
4.代码如下
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>> dp(n,vector<int>(3,0));
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = 0;
for(int i=1;i<n;i++)
{
dp[i][0] = max(dp[i-1][0],dp[i-1][2]-prices[i]); //有
dp[i][1] = dp[i-1][0]+prices[i]; //没有,在冷冻
dp[i][2] = max(dp[i-1][1],dp[i-1][2]); //没有,不在冷冻
}
return max(dp[n-1][1],dp[n-1][2]);
}
};