代码随想录训练营 Day50
今日任务
123.买卖股票的最佳时机Ⅲ
188.买卖股票的最佳时机Ⅳ
语言:Java
123. 买卖股票的最佳时机Ⅲ
链接:
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/
误区:这里说的第i天的状态,并不是说在第i天一定要执行这几种操作,而是说在第i天已经执行过什么操作;比如dp[i][0]并不是说只有第i天没有进行任何交易,i-1天可能进行了1或2次交易,而是说截至第i天都处于一种没有交易的状态。
class Solution {
public int maxProfit(int[] prices) {
//dp[i][j]
int[][] dp = new int[prices.length][5];
//明确一天的状态只有5个
//1.无交易
//2.第一次买入
//3.第一次卖出
//4.第二次买入
//5.第二次卖出
dp[0][1] = -prices[0];
dp[0][3] = -prices[0];
for(int i = 1; i < prices.length; i++){
dp[i][0] = dp[i - 1][0];
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]);
dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
}
return dp[prices.length - 1][4];
}
}
188. 买卖股票的最佳时机Ⅳ
链接:
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/
class Solution {
public int maxProfit(int k, int[] prices) {
int[][] dp = new int[prices.length][2 * k + 1];
for(int j = 1; j < 2 * k + 1; j += 2){
dp[0][j] = -prices[0];
}
for(int i = 1; i < prices.length; i++){
dp[i][0] = dp[i - 1][0];
for(int j = 1; j < 2 * k + 1; j++){
//买入
if(j % 2 == 1){
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[prices.length - 1][2 * k];
}
}
版权声明:本文为weixin_38255385原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。