題目鏈接:leetcode714
思路:dp1[i]表示到達i位置手中持有股票的最大利潤,dp2[i]表示到達i位置手中不持有股票的最大利潤,狀態轉移:每次手中持有股票(或不持有)都能夠依賴於上一個相同狀態的集合,即dp1[i-1](或dp2[i-1])。還能夠由不同屬性的集合傳遞過來:即當前手中沒有能夠由之前有的賣出並扣除手續費傳遞到當前集合;當前手中沒有的集合也同理,區別就是不用扣除手續費,因爲手續費是在賣出的時候計算的。
Code:
class Solution {
public:
int maxProfit(vector<int>& val, int fee) {
int n = val.size();
vector<int> dp1(n); //第i天手中有股票的最大利潤( 持有股票 )
vector<int> dp2(n); //第i天未持有股票股票的最大利潤(不持有股票)
dp1[0] = -val[0]; //第一天根據定義只能買入
dp2[0] = 0; //當天買入再賣出一定會虧損所以第一天不賣
for(int i=1; i<n; i++) {
dp1[i] = max(dp1[i - 1], dp2[i - 1] - val[i]); //第i天持有股票
dp2[i] = max(dp2[i - 1], dp1[i - 1] + val[i] - fee); //第i天賣出並支付手續費
}
return dp2[n - 1]; //最終手裏沒股票(要把資金轉爲利潤)
}
};