309. 最佳买卖股票时机含冷冻期
class Solution {
public int maxProfit(int[] prices) {
//错因:算法思路没想到就是细分情景,穷举出所有可能的情况再动态规划
int n=prices.length;
//dp[i][0]表示第i天买入股票时的最大利润--->
//注意这里的买入不是今天就刚买入的意思可能是好几天前买入的状态
//dp[i][1]表示第i天卖出股票时的最大利润
//dp[i][2]表示第i天刚好处于冷冻期时的最大利润
//dp[i][3]表示第i天未处于冷冻期时最大利润
int[][] dp=new int[n+1][4];
dp[0][0]=-prices[0];
for(int i=1;i<n+1;i++){
dp[i][0]=Math.max(dp[i-1][0],Math.max(dp[i-1][2],dp[i-1][3])-prices[i-1]);
dp[i][1]=dp[i-1][0]+prices[i-1];
dp[i][2]=dp[i-1][1];
dp[i][3]=Math.max(dp[i-1][2],dp[i-1][3]);
}
// return dp[n][1]>0?dp[n][1]:0;
//注意我们上面列举出的情况,如果上面最后一天不是股票刚卖出的一天
//那么此时的dp[n][1]就是继承上一次股票卖出时的最大值,
//所以我们要列出最后一天可能出现最大值的所有情况
return Math.max(dp[n][1],Math.max(dp[n][2],dp[n][3]));
}
}