持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第32天,点击查看活动详情
309. 最佳买卖股票时机含冷冻期
给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
「示例1:」
输入: prices = [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
「示例2:」
输入: prices = [1]
输出: 0
「提示:」
1. 1 <= prices.length <= 5000
2. 0 <= prices[i] <= 1000
解题思路
设dp[i][0]表示第i天交易完后无股票,dp[i][1]表示第i天交易完后有股票
则dp[i][0] 今天没股票,可能是
1/昨天也没股票dp[i-1][0] 2/昨天有股票,今天卖出了dp[i-1][1]+price[i]
则d[i][1] 今天有股票,可能是
1/昨天也有股票dp[i-1][1] 2/昨天没股票,昨天肯定为冷冻期,不然今天不可能买股票
所以i-2天做了卖出操作即 dp[i-2][0] - price[i] i-2天卖出 所以是[0],今天买了 -price[i]
所以第i天的最大收益为
dp[i][0] = Math.max( dp[i-1][0], dp[i-1][1]+price[i] )
dp[i][1] = Math.max( dp[i-1][1], dp[i-2][0] - price[i] )
最后一天的最大收益是肯定要卖出股票的
所以求第n天的话就是dp[n][0]的值
然后写初始条件
dp[0][0] = 0 第一天没股票为0
dp[0][1] = -prices[0] 第一天有股票为-prices[0]
dp[1][0] = Math.max(dp[0][0], dp[0][1]+price[1])
dp[1][1] = Math.max(dp[0][1], dp[0][0]-price[1])
代码实现
/**
* @param {number[]} prices
* @param {number} fee
* @return {number}
*/
var maxProfit = function(prices) {
if(prices.length<2)return 0
let dp = Array.from(new Array(prices.length), () => new Array(2).fill(0));
dp[0][0] = 0;
dp[0][1] = -prices[0];
dp[1][0] = Math.max(dp[0][0],dp[0][1]+prices[1]);
dp[1][1] = Math.max(dp[0][1],dp[0][0]-prices[1]);
for(let i = 2; 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-2][0]-prices[i]);
}
return dp[prices.length-1][0];
};
如果你对这道题目还有疑问的话,可以在评论区进行留言;