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