188.买卖股票的最佳时机IV
代码随想录
最多可以买卖K次。
- dp数组
- 定义数组dp[price.size][2k+1]
- 递推公式
- for(j = 0 ; j < 2k-1 ; j+=2)
- dp[i][j+1] = max(dp[i-1][j+1],dp[i-1][j]-prices[i])
- dp[i][j+2] = max(dp[i-1][j+2],dp[i-1][j+1]+prices[i])
- for(j = 0 ; j < 2k-1 ; j+=2)
- 初始化
- for(int j = 1;j<2k;j+=2)
- dp[0][j] = -prices[0]
- for(int j = 1;j<2k;j+=2)
- 遍历
- 从前向后遍历
- 最终返回
- dp[price.length-1][2*k]
代码
class Solution {
public int maxProfit(int k, int[] prices) {
if(prices.length==1) return 0;
int[][] dp = new int[prices.length][2 * k + 1];
for (int j = 1; j < 2 * k; j += 2) {
dp[0][j] = -prices[0];
}
for (int i = 1; i < prices.length; i++) {
for (int j = 0; j < 2 * k - 1; j += 2) {
dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
dp[i][j + 2] = Math.max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
}
}
return dp[prices.length - 1][2 * k];
}
}
309.最佳股票时机冷冻期
本题加了一个冷冻期,状态就多了,有点难度,大家要把各个状态分清,思路才能清晰
视频讲解:动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期_哔哩哔哩_bilibili
代码随想录
- dp数组
- dp[i][0] :持股状态
- dp[i][1]:保持卖出股票的状态
- dp[i][2]:具体卖出股票的状态
- dp[i][3]:冷冻期
- 递推公式
- dp[i][0] = Math.max(dp[i-1][0],dp[i-1][3]-price[i],dp[i-1][1]-prices[i])
- dp[i][1] = Math.max(dp[i-1][1],dp[i-1][3])
- dp[i][2] = dp[i-1][0]+prices[i]
- dp[i][3] = dp[i-1][2]
- 初始化
- dp[0][0] = -prices[0]
- dp[0][1] = 0
- dp[0][2] = 0
- dp[0][3] = 0
- 遍历顺序
- 从前向后遍历
- 最终返回
- Math.max(dp[prices.length-1][1],dp[prices.length-1][2],dp[prices.length-1][3],)
代码
class Solution {
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length][4];
//初始化
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = 0;
dp[0][3] = 0;
//递推
for (int i = 1; i < prices.length; i++) {
dp[i][0] = Math.max(Math.max(dp[i - 1][0], dp[i - 1][3] - prices[i]), dp[i - 1][1] - prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][3]);
dp[i][2] = dp[i - 1][0] + prices[i];
dp[i][3] = dp[i - 1][2];
}
return Math.max(Math.max(dp[prices.length - 1][1], dp[prices.length-1][2]), dp[prices.length-1][3]);
}
}
714.买卖股票的最佳时机含手续费
相对122.买卖股票的最佳时机II ,本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的,可以尝试自己做一做。
视频讲解:动态规划来决定最佳时机,这次含手续费!| LeetCode:714.买卖股票的最佳时机含手续费_哔哩哔哩_bilibili
代码
class Solution {
public int maxProfit(int[] prices, int fee) {
int[][] dp = new int[prices.length][2];
dp[0][0] = -prices[0];
dp[0][1] = 0;
for (int i = 1; i < prices.length; i++) {
dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);
dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);
}
return Math.max(dp[prices.length-1][0],dp[prices.length-1][1]);
}
}