###### tags: `LeetCode` `Dynamic Programming` `Hard` # LeetCode #123 [Best Time to Buy and Sell Stock III](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii) ### (Hard) 給定一個數組,它的第 i 個元素是一支給定的股票在第 i 天的價格。 設計一個算法來計算你所能獲取的最大利潤。你最多可以完成 兩筆 交易。 注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票) --- 動態規劃題。 有四種狀態, 分別為: 1. 買一, 2.買一賣一, 3. 買二賣一, 4.買二賣二。狀態1為初始狀態買入或是維持狀態一達成(states[1], -prices[i]), 狀態2由維持狀態二或是狀態1賣出股票達成(states[2],states[1]+prices[i])。由此進行for循環, 每次狀態選擇最大值, 在循環結束後比較狀態2,4中較大者即為解 --- ``` class Solution { public: int maxProfit(vector<int>& prices) { int states[4]={INT_MIN, 0, INT_MIN, 0}; for(int i=0;i<prices.size();i++){ states[0]=max(states[0], -prices[i]); states[1]=max(states[1], states[0]+prices[i]); states[2]=max(states[2], states[1]-prices[i]); states[3]=max(states[3], states[2]+prices[i]); } return max(states[1],states[3]); } }; ```