LeetCode309最佳買賣股票時機含冷凍期(動態規劃)

題目鏈接leetcode309

在這裏插入圖片描述

思路:因爲本題中規定買入,賣出和冷凍操作,規定上一次賣出和下一次買入之間需要至少一天的冷凍期,因此我們定義三種狀態sell、buy和cooldown,分別對應了到第i天爲止最後一個操作是買入、賣出和冷凍所對應的最大利潤,則狀態轉移方程如下:

  1. sell[i]=max(sell[i-1],buy[i-1]+prices[i]);
  2. buy[i]=max(buy[i-1],cooldown[i-1]-prices[i]);
  3. cooldown[i]=max(cooldown[i-1],max(sell[i-1],buy[i-1])).

Code

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.empty()) return 0;
        int n=prices.size(); //數量
        vector<int> sell(n,0); //手中不持有股票
        vector<int> buy(n,0); //手中持有股票
        vector<int> cooldown(n,0); //此時爲冷凍期(可能持有也可能不持有)的最大利潤
        buy[0]=-prices[0]; //根據定義第一天持有股票就一定要購買
        for(int i=1;i<n;i++){
            sell[i]=max(sell[i-1],buy[i-1]+prices[i]); //不持有股票要
            buy[i]=max(buy[i-1],cooldown[i-1]-prices[i]); //持有股票由於有冷凍期的原因要經過一個冷凍期才能夠再次購買
            cooldown[i]=max(cooldown[i-1],max(sell[i-1],buy[i-1])); //更新冷凍期的最大利潤
        }
        return sell.back();
    }
};

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