123 买卖股票的最佳时机III
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/
class Solution { //dpij, i表示还能买几次,j表示是否持有
public int maxProfit(int[] prices) {
int dp20 = 0, dp00 = 0, dp10 = 0, dp11 = -prices[0], dp01 = -prices[0];
for (int i = 0; i < prices.length; i++) {
dp00 = Math.max(dp01 + prices[i], dp00);
dp01 = Math.max(dp10 - prices[i], dp01);
dp10 = Math.max(dp11 + prices[i], dp10);
dp11 = Math.max(dp20 - prices[i], dp11);
}
return dp00;
}
}
188 买卖股票的最佳时机IV
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/
class Solution {
public int maxProfit(int k, int[] prices) {
k = Math.min(k, prices.length / 2); //再大没有约束了
int[] hold = new int[k + 1];
int[] unhold = new int[k + 1];
Arrays.fill(hold, - prices[0]); // bug,不是只让 hold[k - 1] = - prices[0], 而是全部除了最后一个hold[k]=0
hold[k] = 0; // 还剩 k 次交易
for (int i = 0; i < prices.length; i++) {
for (int j = k - 1; j >= 0; j--) {
hold[j] = Math.max(hold[j], unhold[j + 1] - prices[i]);
unhold[j] = Math.max(unhold[j], hold[j] + prices[i]);
}
}
return unhold[0];
}
}