###### tags: `LeetCode` `Dynamic Programming` `Medium` # LeetCode #309 [Best Time to Buy and Sell Stock with Cooldown](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown) ### (Medium) 給定一個整數數組,其中第 i 個元素代表了第 i 天的股票價格 。​ 設計一個算法計算出最大利潤。在滿足以下約束條件下,你可以盡可能地完成更多的交易(多次買賣一支股票): 你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。 賣出股票後,你無法在第二天買入股票 (即冷凍期為 1 天)。 --- 動態規劃題 這題有三個狀態, hold, sell, cd, 彼此關係為: * hold=max(hold, cd-prices[i]) * sell[i]=max(sell, hold+prices[i]) * cd[i]=max(cd, sell) 要注意hold的初始值為INT_MIN, sell與cd的初始值皆為0, 否則第一天的sell會變為prices[0]。 --- ``` class Solution { public: int maxProfit(vector<int>& prices) { if(prices.size()>=2){ int i=prices.size(); int hold=INT_MIN, sell=0, cd=0; for(i=0;i<prices.size();i++){ int hold2=hold, sell2=sell, cd2=cd; hold=max(cd2-prices[i],hold2); sell=max(sell2, hold2+prices[i]); cd=max(sell2, cd2); } return max(sell,cd); } return 0; } }; ```