123.买卖股票的最佳时机III
讲解链接:代码随想录-123.买卖股票的最佳时机III
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length][5];
// 0 第一次持有股票 1 第一次不持有股票 2 第二次持有股票 3 第二次不持有股票。
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = -prices[0];
dp[0][3] = 0;
for (int i = 1; i < prices.length; i++) {
// 持有股票,根据 前一天持有的余额 和 今天股票价格的负数 比较,取最大值
dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);
// 不持有股票,获根据 前一天不持有股票 和 前一天持有股票加上今天股票价格 比较,取最大值
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
// 第二次持有股票,根据 前一天第二次持有股票和前一天不持有股票减去今天股票价格,取最大值
dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] - prices[i]);
// 第二次不持有股票,根据 前一天第二次不持有股票 和 前一天第二次持有股票加上当天股票价格 比较,取最大值
dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] + prices[i]);
}
return dp[prices.length - 1][3];
}
188.买卖股票的最佳时机IV
讲解链接:代码随想录-188.买卖股票的最佳时机IV
public int maxProfit(int k, int[] prices) {
int[][] dp = new int[prices.length][k * 2];
for (int i = 0; i < k; i++) {
dp[0][i * 2] = -prices[0];
}
for (int i = 1; i < prices.length; i++) {
for (int j = 0; j < dp[i].length; j++) {
if (j % 2 == 0) {
if (j == 0) {
dp[i][j] = Math.max(dp[i - 1][j], -prices[i]);
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]);
}
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] + prices[i]);
}
}
}
return dp[dp.length - 1][k * 2 - 1];
}