dp[i]表示到i天时候卖出(天数从0开始编号)所能取得的最大收益,所以第i-1天必须持有(当天买当天卖的情况就是0,编程时将答案ans初始化为0就不需要考虑当天买卖了)。那么就是看是第i-1天之前买入的,还是第i-1天买入的了,即

图片说明

也就是说,当dp[i-1]为负的时候,就直接取这一天的"收益"就行了(当然这一天的"收益"也可能是负的,只是不必考虑当天买当天卖的情况了,如前面所解释的只要将ans最开始设置为0就行了)。

另外,因为dp[i]只可能使用了上一时刻的dp[i-1],而且ans可以在dp生成过程中算出来,所以没必要把dp开成数组了,直接用一个int dp就完事了。

class Solution {
public:
    int maxProfit(vector<int> &v) {
        int len = v.size();
        int dp = 0;
        int ans = 0;
        for(int i=1;i<len;i++) {
            if(dp<0)
                dp = v[i] - v[i-1];
            else
                dp = dp + v[i] - v[i-1];
            if(dp > ans)
                ans = dp;
        }
        return ans;
    }
};