LeetCode 309. Best Time to Buy and Sell Stock with Cooldown

題目意思大概是給出連續n天的股價,做出以下限制:spa

  1. 只能一次性買入賣出,不能分批交易。分屢次買入再賣出或者買入一次而後分屢次賣出都是不容許的。
  2. 賣出之後有一天的時間不能交易 (one day cooldown time)。

交易次數不限。求能夠得到的最大利潤。code

 

根據題意,畫出DFA以下blog

天天能夠採起的動做有3種:it

  1. 什麼也不幹
  2. 買入
  3. 賣出

初始狀態爲idle,手頭沒有任何股票,且能夠進行買入交易。io

若是當天或以前有買入動做,則狀態爲hold,持有股票。class

若是當天有賣出動做,則狀態變爲sold。手頭再也不持有股票,但也不能買入。im

至此,咱們能夠分別計算3種狀態下,採起不一樣的行動之後各個狀態的最大利潤。img

hold:di

前一天爲idle,當天買入,或者以前有買入動做,當天什麼也不作:時間

hold = max(idle - prices[i], hold);

idle:

idle能夠由以前的idle或sold狀態變化而來:

idle = max(idle, sold);

sold:

當天賣出,由hold狀態變化而來,注意,當天買入當天賣出是容許的。

sold = hold + prices[i];

 

最終代碼以下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.empty() || prices.size() <= 1){
            return 0;
        }
        
        int idle = 0, hold = -prices[0], sold = 0;
        for(int i = 1; i < prices.size(); i++){
            hold = max(idle - prices[i], hold);
            idle = max(idle, sold);
            sold = hold + prices[i];
        }
        
        return max(sold, idle);
    }
};
相關文章
相關標籤/搜索