188. 买卖股票的最佳时机IV
动态规划
class Solution {
public int maxProfit(int k, int[] prices) {
if (prices.length == 0){
return 0;
}
int[][] dp = new int[prices.length][2 * k + 1];
for (int i = 1; i < 2 * k + 1; i += 2) {
dp[0][i] = -prices[0];
}
/**
* 对《123. 买卖股票的最佳时机III》进行推广
* 总共有2 * k + 1种状态,奇数买入或者持有,偶数卖出
* dp[i][0]:没有操作
* dp[i][1]:已买过一次,可能是之前买的,可能是之前没买今天买
* dp[i][2]:已卖过一次,可能是之前卖的,可能是之前买过今天卖
* ...
*/
for (int i = 1; i < prices.length; i++) {
dp[i][0] = dp[i - 1][0];
for (int j = 1; j < 2 * k + 1; j += 2) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]);
dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] + prices[i]);
}
}
return dp[prices.length - 1][2 * k];
}
}
/**
* 时间复杂度 O(n^2)
* 空间复杂度 O(n^2)
*/
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/