打卡羣刷題總結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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索