最多只能交易两次,因此只能用到dp做法,也可以拓展到只能交易n次。
dp[i][j][0/1]表示到第i个物品,第j次交易,买/卖得到的当前收益,第一维可以优化掉。
然后第j次交易买的收益显然就是第j-1次交易卖后的收益再减去当前价格。而卖的收益就是前面算出的买的收益再加上当前价格,注意这里指的是先卖再买。
code
class Solution {
public:
int dp[3][2];
int maxProfit(vector<int>& prices) {
int n=prices.size();
int ans=0;
for(int i=1;i<=2;i++){
dp[i][0]=-0x3f3f3f3f;
dp[i][1]=0;
}
for(int i=0;i<n;i++){
for(int j=1;j<=2;j++){
dp[j][0]=max(dp[j][0],dp[j-1][1]-prices[i]);
dp[j][1]=max(dp[j][1],dp[j][0]+prices[i]);
ans=max(ans,dp[j][1]);
}
}
return ans;
}
};