Top 100 Linked Question 修煉------第309題

309. Best Time to Buy and Sell Stock with Cooldown

題目鏈接

題目解釋

假設你有一個數組,數組裏面的第i個元素是第i天的股票的價格。

設計一個算法找到最大的收益,你可以完成任意次數的交易(即可以買賣一個股票多次),但是存在如下的限制:

  • 你不能一次進行多個交易(比如:你在買股票之前必須賣掉股票)
  • 在賣了你的股票之後,你在賣股票的下一天不能買股票(即存在冷凍期)

Example:

Input: [1,2,3,0,2]
Output: 3 
Explanation: transactions = [buy, sell, cooldown, buy, sell]

題目分析

本題中存在一定的狀態轉移過程,主要是條件的約束過程,存在這樣的解答的話我們可以去畫出狀態轉移圖:

圖片參考地址:https://blog.csdn.net/zjuPeco/article/details/76468185

這裏我們引入了三個狀態分別爲買,休息以及賣,我們需要引入三個數組,分別爲buy,rest,sell,其中:

buy[i]表示在第i天之前最後一個操作是買(並不一定需要第i天去買),此時的最大收益。

sell[i]表示在第i天之前最後一個操作是賣,此時的最大收益。

rest[i]表示在第i天之前最後一個操作是冷凍期,此時的最大收益。

我們可以從這個狀態轉移圖,得到每個數組之間的狀態轉移方程:

# 第i天之前最後一個操作是買時,獲得的最大利潤爲第i-1天的價格減去第i天買入的價格與第i-1天買入最大值
buy[i]  = max(rest[i-1] - price, buy[i-1]) 
sell[i] = max(buy[i-1] + price, sell[i-1])
rest[i] = max(sell[i-1], buy[i-1], rest[i-1])

上述遞推式很好的表示了在買之前有冷凍期,買之前要賣掉之前的股票。一個小技巧是如何保證[buy, rest, buy]的情況不會出現,這是由於buy[i] <= rest[i], 即rest[i] = max(sell[i-1], rest[i-1]),這保證了[buy, rest, buy]不會出現。

class Solution:
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        if not prices:
            return 0
        len_prices = len(prices)
        # 初始化三個數組,確定三個數組的含義
        buy, sell, cooldown = [0]*len_prices, [0]*len_prices, [0]*len_prices
        # 初始化,其中第1天是可以買入的
        buy[0] = -prices[0]
        for i in range(1, len_prices):
            # 如果第i天是冷卻期,那麼這天的收益和前一天賣出股票的收益相同
            cooldown[i] = sell[i-1]
            # 如果第i天賣出股票,那麼無非是i-1之前就持有股票,所以index:i-1天也可以賣出,或者另一種情況就是index:i-1當天買入了股票。
            sell[i] = max(sell[i-1], buy[i-1] + prices[i])
            # 如果第i天買入股票,無非是i-1之前就不持有股票,我們要考慮哪天買,所以i-1也可以買入(第i-1天不持有股票),或者另一種可能就是i-1天是冷凍期。
            buy[i] = max(buy[i-1], cooldown[i-1] - prices[i])

        return max(sell[len_prices - 1], cooldown[len_prices - 1])

PS:後序在整理的時候還會進行一定的優化,並且將所有的股票問題全都寫出來。

Reference

https://www.cnblogs.com/grandyang/p/4997417.html

總結

2019/6/11:多個狀態之間的轉移還是比較困難的.....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章