明显的单调队列……

但下面的程序一直有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.                                          
View Code

相关文章: