for(int i=1;i<=t;i++){
int u=i-w-1;
int h1=0,h2=0,t1=-1,t2=-1;
for(int j=0;j<=maxp;j++){
if(j<=as[i]){
dp[i][j]=-j*ap[i];
}
dp[i][j]=max(dp[i-1][j],dp[i][j]);
if(u>=0){
while(h1<=t1&&q1[h1]<j-as[i]){
h1++;
}
while(h1<=t1&&dp[u][q1[t1]]+q1[t1]*ap[i]<dp[u][j]+j*ap[i]){
t1--;
}
q1[++t1]=j;
dp[i][j]=max(dp[u][q1[h1]]+q1[h1]*ap[i]-j*ap[i],dp[i][j]);
}
}
for(int j=maxp;j>=0;j--){
if(u>=0){
while(h2<=t2&&q2[h2]>j+bs[i]){
h2++;
}
while(h2<=t2&&dp[u][q2[t2]]+q2[t2]*bp[i]<dp[u][j]+j*bp[i]){
t2--;
}
q2[++t2]=j;
dp[i][j]=max(dp[u][q2[h2]]+q2[h2]*bp[i]-j*bp[i],dp[i][j]);
}
}
}
不过样例的code
for(int i=1;i<=t;i++){
int u=i-w-1;
int h1=0,h2=0,t1=-1,t2=-1;
for(int j=0;j<=maxp;j++){
if(j<=as[i]){
dp[i][j]=-j*ap[i];
}
dp[i][j]=max(dp[i-1][j],dp[i][j]);
//dp[i][j]=max(dp[u][j],dp[i][j]);
if(u>=0){
while(h1<=t1&&q1[h1]<j-as[i]){
h1++;
}
dp[i][j]=max(dp[u][q1[h1]]+q1[h1]*ap[i]-j*ap[i],dp[i][j]);
while(h1<=t1&&dp[u][q1[t1]]+q1[t1]*ap[i]<dp[u][j]+j*ap[i]){
t1--;
}
q1[++t1]=j;
}
}
for(int j=maxp;j>=0;j--){
if(u>=0){
while(h2<=t2&&q2[h2]>j+bs[i]){
h2++;
}
dp[i][j]=max(dp[u][q2[h2]]+q2[h]*bp[i]-j*bp[i],dp[i][j]);
while(h2<=t2&&dp[u][q2[t2]]+q2[t2]*bp[i]<dp[u][j]+j*bp[i]){
t2--;
}
q2[++t2]=j;
}
}
}