最多可以完成 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;
}