明显的单调队列……
但下面的程序一直有bug
附上题解:http://blog.csdn.net/njlcazl/article/details/8611042
附上我的代码:
1 var head,tail,i,n,maxp,w,t,ans,j:longint; 2 as,bs,ap,bp,q,val:array[0..2020] of longint; 3 f:array[0..2020,0..2020] of longint; 4 function max(x,y:longint):longint; 5 begin 6 if x>y then exit(x) else exit(y); 7 end; 8 procedure init; 9 begin 10 readln(n,maxp,w);ans:=0; 11 for i:=1 to n do readln(ap[i],bp[i],as[i],bs[i]); 12 end; 13 procedure main; 14 begin 15 fillchar(f,sizeof(f),128); 16 f[0,0]:=0; 17 for i:=1 to n do 18 begin 19 for j:=0 to as[i] do f[i,j]:=-j*ap[i]; 20 for j:=0 to as[i] do 21 f[i,j]:=max(f[i,j],f[i-1,j]); 22 t:=i-w-1; 23 if t>=0 then 24 begin 25 head:=0;tail:=0; 26 for j:=0 to maxp do 27 begin 28 while (head<tail) and (q[head]<j-as[i]) do inc(head); 29 while (head<tail) and (f[t,j]+j*ap[i]>=val[tail-1]) do dec(tail); 30 val[tail]:=f[t,j]+j*ap[i]; 31 q[tail]:=j;inc(tail); 32 if head<tail then f[i,j]:=max(f[i,j],val[head]-j*ap[i]); 33 end; 34 head:=0;tail:=0; 35 for j:=maxp downto 0 do 36 begin 37 while (head<tail) and (q[head]>j+bs[i]) do inc(head); 38 while (head<tail) and (f[t,j]+j*bp[i]>=val[tail-1]) do dec(tail); 39 val[tail]:=f[t,j]+j*bp[i]; 40 q[tail]:=j;inc(tail); 41 if head<tail then f[i,j]:=max(f[i,j],val[head]-j*bp[i]); 42 end; 43 end; 44 ans:=max(ans,f[i,0]); 45 end; 46 writeln(ans); 47 end; 48 begin 49 init; 50 main; 51 end.