最多可以完成 k 笔交易
public int maxProfit(int k, int[] prices) {
//三维DP动态规划。三个维度,第一维表示天,第二维表示交易了几次,第三维表示是否持有股票
if(prices == null) return 0;
int len = prices.length;
if(len == 0) return 0;
//当k大于等于数组长度一半时, 问题退化为贪心问题
if(k >= len / 2) {
return k_inf(prices);
}
int[][][] dp = new int[len][k + 1][2];
for(int i = 0; i < len; i ++) {
for(int j = k; j > 0; j --) {
if(i == 0) {
dp[0][j][0] = 0;
dp[0][j][1] =- prices[0];
continue;
}
dp[i][j][0] = Math.max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i]);
dp[i][j][1] = Math.max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - prices[i]);
}
}
return dp[len - 1][k][0];
}
//贪心
public int k_inf(int[] prices) {
int res = 0;
for(int i = 1; i < prices.length; i ++) {
if(prices[i] > prices[i - 1]) {
res += prices[i] - prices[i - 1];
}
}
return res;
}