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.

  

你可能感兴趣的:(股票)