import java.util.*; public class Solution { public int maxProfit (int[] prices, int k) { int n = prices.length; if(k > n/2){ return maxProfitAny(prices,k); }else{ return maxProfitK(prices,k); } } private int maxProfitAny(int[] prices,int k){ int n = prices.length; int[][] dp = new int[n][2]; for(int i = 0;i<n;i++){ if(i-1 == -1){ dp[i][0] = 0; dp[i][1] = -prices[i]; continue; } dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]); dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]-prices[i]); } return dp[n-1][0]; } private int maxProfitK(int[] prices, int maxK){ int n = prices.length; int[][][] dp = new int[n][maxK+1][2]; for(int i = 0;i<n;i++){ dp[i][0][0] = 0; dp[i][0][1] = Integer.MIN_VALUE; } for(int i = 0;i<n;i++){ for(int k = maxK;k >=1;k--){ if(i-1 == -1){ dp[i][k][0] = 0; dp[i][k][1] = -prices[i]; continue; } dp[i][k][0] = Math.max(dp[i-1][k][0],dp[i-1][k][1]+prices[i]); dp[i][k][1] = Math.max(dp[i-1][k-1][0]-prices[i],dp[i-1][k][1]); } } return dp[n-1][maxK][0]; } }