class Solution {
public int maxProfit(int[] prices) {
/**
1.确定dp数组
dp[i][0] 考虑到第i天持有股票
dp[i][1] 第i天卖出股票
dp[i][2] 第i天冷冻期
dp[i][3] 考虑到第i天保持卖出股票的状态
*/
int n = prices.length;
int[][] dp = new int[n][4];
/**
2.确定递推关系
第i天持股票,有三种情况:
1. 第i-1天就已经持有了
2. 第i天才持有的,第i-1天是保持卖出状态
3. 第i天才持有的,第i-1天是冷冻期
dp[i][0] = Math.max(dp[i-1][0],dp[i-1][2] - prices[i],dp[i-1][3] - prices[i]);
第i天卖出股票,只有一种情况:第i-1天持有
dp[i][1] = dp[i-1][0] + prices[i];
第i天冷冻期,只有一种情况,第i-1天卖出
dp[i][2] = dp[i-1][1];
第i天保持卖出股票状态,两种情况:第i-1天就保持卖出股票状态或者第i-1天是冷冻期
dp[i][3] = Math.max(dp[i-1][3],dp[i-1][2]);
*/
/**
3.初始化
第0天就持有 dp[0][0] = -prices[0];
第0天就卖出 当天买入卖出 dp[0][1] = 0;
第0天就冷冻期 当天买入卖出 dp[0][2] = 0;
第0天就保持卖出状态(不合理) 根据递推公式来初始化 dp[0][3] = 0;
*/
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = 0;
dp[0][3] = 0;
// 4.遍历顺序 从小到大遍历
for(int i=1; i<n; i++){
dp[i][0] = Math.max(dp[i-1][0],Math.max(dp[i-1][2] - prices[i],dp[i-1][3] - prices[i]));
dp[i][1] = dp[i-1][0] + prices[i];
dp[i][2] = dp[i-1][1];
dp[i][3] = Math.max(dp[i-1][3],dp[i-1][2]);
}
// 最后结果从 卖出,冷冻期,保持卖出三个状态中选最大的
return Math.max(dp[n-1][1],Math.max(dp[n-1][2],dp[n-1][3]));
}
}
运行结果: