import java.util.*;


public class Solution {

    //最多进行两次买入卖出,
    //此时股票的状态相对于第二题多了几种
    //dp[i][0]表示到第i天为止没有买过股票的最大收益
    //1买过1次未卖成
    //2买过一次卖出一次
    //3买个两次卖出1次
    //4买过2次卖出2次
   
    public int maxProfit (int[] prices) {
       int n = prices.length;
        int[][] dp = new int[n][5];
        //初始化dp为最小
        Arrays.fill(dp[0], -10000);
        //第0天不持有状态
        dp[0][0] = 0;
        //第0天持有股票
        dp[0][1] = -prices[0];
        //状态转移
        for(int i = 1; i < n; i++){
             //未买过
            dp[i][0] = dp[i - 1][0];
            //买1,未买出分为之前买过一次和当天买
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
//          买卖1次,分为之前买卖完成,和今天卖出
            dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
            //买入2卖出1,分为当天买入第二个和之前买入第二个
            dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
            //卖出2次,分为之前完成和当天卖出第二个
            dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
        }
        //选取最大值(一定在都卖出的情况下),可以只操作一次
        return Math.max(dp[n - 1][2],Math.max(0, dp[n - 1][4]));
    }
}