力扣-122-買股票最佳時機

1、看不出來,腦筋急轉彎?只要下一天高就賣出當天還可以買入迭代就好了。。

2、

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int sum=0;
        for(int i=0;i<prices.size()-1;i++)
        {
            int j=i+1;
                if(prices[i]<prices[j])
                {
                    sum+=prices[j]-prices[i];
                    //i++;
                }            
        }
        return sum;
    }
};

3、還是別人寫的動態規劃看着很舒服

.動態規劃

第iii天僅有兩種狀態:持有或不持有.
假設數組dp[i][0]表示第i天不持有股票時的利益:dp[0][0] = 0
dp[i][1]表示第i天持有股票時的利益:dp[0][1] = -prices[0]
相關的狀態分析如下:

    持有狀態:
    1.今天買入:則昨天是不持有的狀態,當天利益爲dp[i-1][0]-prices[i];
    2.前一天也持有:今天沒有賣出,當天利益爲dp[i-1][1];
    取其大着作爲當天持有狀態下的利益。
    非持有狀態:
    1.今天賣出:則昨天是持有的狀態,當天利益爲dp[i-1][1]+prices[i];
    2.前一天也不持有:則今天也沒有買入,當天利益就是前一天利益,即dp[i-1][0];
    取其大者作爲當天非持有狀態下的利益。

最後一天不持有股票時的利益即爲最大利潤.

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        // 動態規劃解法
        
        // 0.初始判斷
        if(prices.empty()) return 0;
        
        int dp[prices.size()][2];
        // 1.初始狀態
        dp[0][0] = 0;//不持有
        dp[0][1] = -prices[0];

        // 2.狀態轉移
        for(int i = 1; i<prices.size();i++){
            // 3.狀態轉移方程
            dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]);
        }
        return dp[prices.size()-1][0];
    }
};


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章