题目描述:

方法1:二维dp动态规划

dp[i][0],表示第i天拥有股票最大收益

dp[i][1],表示第i天没有股票最大收益

dp[i][0] = max(dp[i-1][0], -price[i])

  • 第i-1天就持有股票,那么就保持现状

  • 第i天买入股票

dp[i][1] = max(dp[i-1][1], dp[i-1][0] + price[i])

  • 第i-1天就不持有股票,那么就保持现状

  • 第i天卖出股票

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>>dp(prices.size(),vector<int>(2,0));
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        for(int i=1;i<prices.size();i++){
            dp[i][0] = max(dp[i-1][0],-prices[i]);
            dp[i][1] = max(dp[i-1][1],prices[i] + dp[i-1][0]);
        }
        return dp[prices.size()-1][1];
    }
};

优化,当天的只与上一天的有关,不需要用到整个数组

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int i = -prices[i]; //dp[i-1][0]
        int j = 0; //dp[i-1][1]
        int p = 0; //dp[i][0]
        int q = 0; //dp[i][1]

        for(int k=1;k<prices.size();k++){
            p = max(i,-prices[k]);
            q = max(j,prices[k] + i);
            i = p;
            j = q;
        }
        return q;
    }
};