0309. 最佳买卖股票时机含冷冻期
最后更新于
这有帮助吗?
这有帮助吗?
max(f(i+1, 0), f(i+1, 1) - prices[i])max(f(i+1, 1), f(i+1, -1) + prices[i])f(i+1, 0)class Solution:
def maxProfit(self, prices):
if not prices:
return 0
n = len(prices)
@lru_cache(None)
def f(i, state):
if i == n - 1:
return prices[i] if state == 1 else 0
if state == -1:
return f(i + 1, 0)
if state == 0:
return max(f(i + 1, 0), -prices[i] + f(i + 1, 1))
if state == 1:
return max(prices[i] + f(i + 1, -1), f(i + 1, 1))
return f(0, 0)buy[i] = Math.max(buy[i - 1], sell[i - 2] - prices[i]);
sell[i] = Math.max(sell[i - 1], buy[i - 1] + prices[i]);/*
* @lc app=leetcode id=309 lang=javascript
*
* [309] Best Time to Buy and Sell Stock with Cooldown
*
*/
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function (prices) {
if (prices == null || prices.length <= 1) return 0;
// 定义状态变量
const buy = [];
const sell = [];
// 寻常
buy[0] = -prices[0];
buy[1] = Math.max(-prices[0], -prices[1]);
sell[0] = 0;
sell[1] = Math.max(0, prices[1] - prices[0]);
for (let i = 2; i < prices.length; i++) {
// 状态转移方程
// 第i天只能是买或者cooldown
// 如果买利润就是sell[i - 2] - prices[i], 注意这里是i - 2,不是 i-1 ,因为有cooldown的限制
// cooldown就是buy[i -1]
buy[i] = Math.max(buy[i - 1], sell[i - 2] - prices[i]);
// 第i天只能是卖或者cooldown
// 如果卖利润就是buy[i -1] + prices[i]
// cooldown就是sell[i -1]
sell[i] = Math.max(sell[i - 1], buy[i - 1] + prices[i]);
}
return Math.max(buy[prices.length - 1], sell[prices.length - 1], 0);
};