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天进行第二次买入
dp[i][4] 考虑到第i天进行第二次卖出
*/
int n = prices.length;
int[][] dp = new int[n][5];
/**
2. 递推关系
dp[i][0] = dp[i-1][0];
dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] - prices[i]);
dp[i][2] = Math.max(dp[i-1][2],dp[i-1][1] + prices[i]);
dp[i][3] = Math.max(dp[i-1][3],dp[i-1][2] - prices[i]);
dp[i][4] = Math.max(dp[i-1][4],dp[i-1][3] + prices[i]);
*/
// 3. 初始化
dp[0][0] = 0;
dp[0][1] = -prices[0];
// 相当于第一天买入,第一天卖出 不赚不赔
dp[0][2] = 0;
// 相当于第一天第二次买入
dp[0][3] = -prices[0];
// 第一天第二次卖出 不赚不赔
dp[0][4] = 0;
// 4. 遍历顺序 从小到大遍历
for(int i=1; i<n; i++){
dp[i][0] = dp[i-1][0];
dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] - prices[i]);
dp[i][2] = Math.max(dp[i-1][2],dp[i-1][1] + prices[i]);
dp[i][3] = Math.max(dp[i-1][3],dp[i-1][2] - prices[i]);
dp[i][4] = Math.max(dp[i-1][4],dp[i-1][3] + prices[i]);
}
// 第二次卖出的钱中包含第一次卖出的钱
return dp[n-1][4];
}
}
运行结果: