打卡群刷题总结0925——最佳买卖股票时机含冷冻期


题目: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_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])

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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索