LeetCode 309. Best Time to Buy and Sell Stock with Cooldown

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/smmyy022/article/details/82877580

题解

注意这道dp题对选择和状态的描述。
用buy sell rest, 三个数组分别表示在 第i天时 能获得的最大收益。
有转移方程:

            buy[i] = max( rest[i-1]-prices[i], buy[i-1] )
            sell[i] = max( buy[i-1]+prices[i], sell[i-1] )
            rest[i] =  max( sell[i-1], buy[i-1], rest[i-1] )

这个方程很好的表述了

  1. sell 必须在 buy 之后
  2. buy 必须在 rest 之后

好好思考一下,还有更好的解法with space csot O(1)。


Code

class Solution {
public:
    const static int N =5000;
    int buy[N],sell[N],rest[N];
    int maxProfit(vector<int>& prices) {

        int n;
        if(prices.empty() || (n=prices.size())<2) return 0;
        
        rest[0] = 0;
        buy[0] = -prices[0];
        sell[0] = 0;
        
        for(int i=1;i<n;i++){
            buy[i] = max(rest[i-1]-prices[i], buy[i-1] );
            sell[i] = max( buy[i-1]+prices[i],sell[i-1]);
            rest[i] = sell[i-1];
        }
        
        return max( sell[n-1],rest[n-1]);
    }
};

猜你喜欢

转载自blog.csdn.net/smmyy022/article/details/82877580