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])); } }