```cpp
#include<cstdio>
#define T 2005
int t,maxp,w,ap[T],bp[T],as[T],bs[T],cnt;
int dp[T][T];//第i天 手持股票j股 赚钱
int hed[T];
inline int rd()
{
int f=1,c=0;char ch = getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){c=10*c+ch-'0';ch=getchar();}
return f*c;
}
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
t=rd(),maxp=rd(),w=rd();
for(int i=1;i<=t;i++)
{
ap[i]=rd(),bp[i]=rd(),as[i]=rd(),bs[i]=rd();
}
for(int i=0;i<=t;i++)
{
for(int j=1;j<=maxp;j++)
{
dp[i][j]=-0x7fffffff;
}
hed[i]=-0x7fffffff;
}
hed[0]=0;
for(int i=1;i<=t;i++)
{
if(i-w-1>0)
{
for(int j=0;j<=maxp;j++)
{
if(dp[i-w-1][j]==-0x7fffffff)break;
hed[j]=max(hed[j],dp[i-w-1][j]);
}
for(int j=0;j<=maxp;j++)
{
dp[i][j]=dp[i-1][j];
}
for(int j=0;j<=maxp;j++)//原状态
{
if(hed[j]==-0x7fffffff)break;
for(int k=1;k<=as[i]&&j+k<=maxp;k++)
{
dp[i][j+k]=max(dp[i][j+k],hed[j]-ap[i]*k);
}
for(int k=1;k<=bs[i]&&j-k>=0;k++)
{
dp[i][j-k]=max(dp[i][j-k],hed[j]+bp[i]*k);
}
}
}else
{
for(int j=0;j<=maxp&&j<=as[i];j++)
{
dp[i][j]=max(dp[i-1][j],-ap[i]*j);
}
}
}
printf("%d\n",dp[t][0]);
return 0;
}
```
by LiGuanlin1124 @ 2018-06-28 20:36:09
求大神指点
by LiGuanlin1124 @ 2018-06-28 20:39:26
问题已解决,谢谢
by LiGuanlin1124 @ 2018-06-28 21:09:13