就是三的解法loop个k遍。
profit[k,i]: k次买卖都在0~i天内执行,在第i天手上钱的最大值。
对于每个k,profit需要分两部计算 (i.e. buy and sell).
例子, k = 3
price: 3 16 6 14 10 19
pass1-buy: -3 -3 -3 -3 -3 -3
pass1-sell: 0 13 13 13 13 16 <- profit[1, i]
pass2-buy: -3 -3 7 7 7 7
pass2-sell: 0 13 13 21 21 26 <- profit[2, i], 这个就是(三)的解
pass3-buy: -3 -3 7 7 11 11
pass3-sell: 0 13 13 21 21 30 <- profit[3, i]
三次操作:3买16卖,6买14卖, 10买19卖, 盈利13+8+9=30
时间O(nk)
空间O(n)
import java.util.*;
public class Solution {
public int maxProfit (int[] prices, int k) {
if (prices.length <= 1) return 0;
int[] cash = new int[prices.length];
for (int i = 0; i < k; i++) {
maxProfitOnePass(prices, cash);
}
return cash[cash.length-1];
}
public void maxProfitOnePass(int[] prices, int[] cash) {
// 买
int maxCash = Integer.MIN_VALUE;
for (int i = 0; i < cash.length; i++) {
cash[i] = Math.max(maxCash, cash[i] - prices[i]);
maxCash = Math.max(maxCash, cash[i]);
}
// 卖
maxCash = Integer.MIN_VALUE;
for (int i = 0; i < cash.length; i++) {
cash[i] = Math.max(maxCash, cash[i] + prices[i]);
maxCash = Math.max(maxCash, cash[i]);
}
}
}