题目:309. 最佳买卖股票时机含冷冻期web
连接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown
算法
给定一个整数数组,其中第 i 个元素表明了第 i 天的股票价格 。数组
设计一个算法计算出最大利润。在知足如下约束条件下,你能够尽量地完成更多的交易(屡次买卖一支股票):微信
你不能同时参与多笔交易(你必须在再次购买前出售掉以前的股票)。编辑器
卖出股票后,你没法在次日买入股票 (即冷冻期为 1 天)。ui
示例:url
输入: [1,2,3,0,2]spa
输出: 3 .net
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]设计
解题:
一、dp问题。每一个时刻,都只有三种情况:持有股票、冷冻期、未持有股票。
咱们使用三个dp数组分别存储这三种状况的最大利润,分别记为dp_with_buy 、dp_in_cool、dp_not_buy ,那么公式有:
dp_with_buy[i] = max(dp_with_buy[i - 1], dp_in_cool[i - 1] - prices[i])
dp_in_cool[i] = max(dp_not_buy[i - 1], dp_in_cool[i - 1])
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if len(prices) < 2:
return 0
dp_not_buy = [0] * len(prices)
dp_with_buy = [0] * len(prices)
dp_in_cool = [0] * len(prices )
dp_with_buy[0] = -prices[0]
for i in range(1, len(prices)):
dp_not_buy[i] = max(dp_not_buy[i - 1], dp_with_buy[i - 1] + prices[i])
dp_with_buy[i] = max(dp_with_buy[i - 1], dp_in_cool[i - 1] - prices[i])
dp_in_cool[i] = max(dp_not_buy[i - 1], dp_in_cool[i - 1])
return max(dp_not_buy[-1], dp_in_cool[-1])
PS:刷了打卡群的题,再刷另外一道题,而且总结,确实耗费不少时间。若是时间不够,之后的更新会总结打卡群的题。
PPS:仍是得日更呀,总结一下老是好的。
本文分享自微信公众号 - 木又AI帮(gh_eaa31cab4b91)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。