经典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;
}
}
京公网安备 11010502036488号