class Solution {
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length + 1][5];
dp[0][0] = 0;
dp[0][1] = -prices[0];
dp[0][3] = -prices[0];
for(int i = 1; i < prices.length + 1;i++){
int price = prices[i - 1];
dp[i][0] = dp[i - 1][0];
dp[i][1] = Math.max(dp[i - 1][1],-price);
dp[i][2] = Math.max(dp[i][1] + price,dp[i - 1][2]);
dp[i][3] = Math.max(dp[i][2] - price,dp[i - 1][3]);
dp[i][4] = Math.max(dp[i][3] + price,dp[i - 1][4]);
}
return dp[prices.length][4];
}
}
dp[i][j]表示第i天j状态下的最大现金。
j = 0 当天没有操作
j = 1 第一次买入
j = 2 第一次卖出
j = 3 第二次买入
j = 4 第二次卖出
初始化第二次买入的时候也是-price[0],因为第一次买入没有卖出,那么他手头的现金就是-price[0]。