经典DP,直接写最多允许k次交易的算法
j=1,3,5,7.....2k+1 手中无股
f[i][j] 表示前i天(第i-1天结束)处于阶段j的最大收益
f[i][j]=max(f[i-1][j],f[i-1][j-1]+p[i-1]-p[i-2])
j=2,4,6,.....2k 持股
f[i][j]=max(f[i-1][j]+p[i-1]-p[i-2],p[i-1][j-1],f[i-1][j-1]+p[i-1]-p[i-2])
int maxProfit(vector<int>& prices) { // write code here int f[200010][5];//此处k为2 int inf=0x3f3f3f3f; int k=5; int n=prices.size(); memset(f,0,sizeof(f)); f[0][1]=0; for(int i=2;i<=k;i++) { f[0][i]=-inf; } int ans=-inf; for(int i=1;i<=n;i++) { //奇数 //f[i][j]=max(f[i-1][j],f[i-1][j-1]+prices[i-1]-prices[i-2]); for(int j=1;j<=k;j+=2) { f[i][j]=f[i-1][j]; if(i>1&&j>1&&f[i-1][j-1]!=-inf) { f[i][j]=max(f[i][j],f[i-1][j-1]+prices[i-1]-prices[i-2]); } //ans=max(ans,f[i][j]); } //f[i][j]=max(f[i-1][j-1],f[i-1][j]+prices[i-1]-prices[i-2],f[i-1][j-2]+prices[i-1]-prices[i-2]); for(int j=2;j<=k;j+=2) { f[i][j]=f[i-1][j-1]; if(i>1&&f[i-1][j]!=-inf) { f[i][j]=max(f[i][j],f[i-1][j]+prices[i-1]-prices[i-2]); } if(i>1&&j>2&&f[i-1][j-2]!=-inf) f[i][j]=max(f[i][j],f[i-1][j-2]+prices[i-1]-prices[i-2]); //ans=max(ans,f[i][j]); } } for(int i=1;i<=k;i+=2) { ans=max(ans,f[n][i]); } return ans; } }