版权声明:本文为博主原创文章,未经博主允许不得转载。 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] )
这个方程很好的表述了
- sell 必须在 buy 之后
- 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]);
}
};