题目描述
思路分析
可以状态机dp,当然如果次数限制为2,可以用前后缀分解法。
枚举第二次买入的时间,因为前后缀独立,则前后分别取最大即可。求前缀需要预处理f[i]:1-i-1天交易的最大收益。求后缀需要从后往前枚举.
这道题的扩展题,如果限制交易不超过k次呢,还可以再限制,两次交易的间隔不少于m天等等。这时候就要用状态机dp去做了。
代码实现
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n=prices.size();
vector<int> f(n+2);
for(int i=1,minprice=INT_MAX;i<=n;i++){
f[i]=max(f[i-1],prices[i-1]-minprice);
minprice=min(minprice,prices[i-1]);
}
int res=0;
for(int i=n,maxprice=0;i>0;i--){
res=max(res,maxprice-prices[i-1]+f[i-1]);
maxprice=max(maxprice,prices[i-1]);
}
return res;
}
};