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.
浙公网安备 33010602011771号