題目鏈接:leetcode309
思路:因爲本題中規定買入,賣出和冷凍操作,規定上一次賣出和下一次買入之間需要至少一天的冷凍期,因此我們定義三種狀態sell、buy和cooldown,分別對應了到第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])).
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();
}
};