MY*****

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.

  

posted on 2011-10-20 07:45  reflec94  阅读(354)  评论(0编辑  收藏  举报

导航