LeetCode714買賣股票的最佳時機含手續費(動態規劃)

題目鏈接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]; //最終手裏沒股票(要把資金轉爲利潤)
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章