设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; } };