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