SCOI2010 股票交易
分析:非常好的动态规划题目,优化的思路来源于提取公因式后充分应用方程的关系,省去一维的枚举过程。
type ji=record w,s:longint; end; var q:array[0..2005] of ji; f:array[-2000..2000,0..2000] of longint; x,i,j,k,head,tail,t,maxp,w,api,bpi,asi,bsi:longint; function max(x,y:longint):longint; begin if x>y then exit(x); exit(y); end; begin readln(t,maxp,w); for i:=-t to t do for j:=1 to maxp do f[i,j]:=-1000000000; for i:=1 to t do begin readln(api,bpi,asi,bsi); head:=1; tail:=1; f[i]:=f[i-1]; q[1].s:=0; q[1].w:=f[i-w-1,0]; for j:=1 to maxp do begin inc(tail); q[tail].w:=f[i-w-1,j]+j*api; q[tail].s:=j; while (head<tail)and(q[tail-1].w<q[tail].w) do begin q[tail-1]:=q[tail]; dec(tail); end; while (head<=tail)and(q[tail].s<j-asi) do inc(head); f[i,j]:=max(f[i,j],q[head].w-api*j); end; head:=1; tail:=1; q[1].s:=maxp; q[1].w:=f[i-w-1,maxp]+maxp*bpi; for j:=maxp-1 downto 0 do begin inc(tail); q[tail].w:=f[i-w-1,j]+j*bpi; q[tail].s:=j; while (head<=tail)and(q[tail].w<x) do begin q[tail-1]:=q[tail]; dec(tail); end; while (head<=tail)and(q[head].s>j+bsi) do inc(head); f[i,j]:=max(f[i,j],q[head].w-j*bpi); end; end; writeln(f[t,0]); end.