QBSELECT - VOI06 Chọn ô

Tác giả: flashmt

Ngôn ngữ: Pascal

const fi='';
      fo='';
      maxn=10000;
      r:array[1..8] of longint=(0,1,2,4,5,8,9,10);
      p:array[0..3] of longint=(1,2,4,8);
var n,re:longint;
    b:array[0..1,1..8] of longint;
    a:array[0..3,1..maxn] of longint;
    tr:array[1..maxn,1..8] of longint;
    kt:boolean;

procedure rf;
var i,j:longint;
begin
     assign(input,fi);
     reset(input);
     read(n);
     for i:=0 to 3 do
         for j:=1 to n do
             read(a[i,j]);
     close(input);
end;

procedure pr;
var i,j,k,t,q,max:longint;
begin
     fillchar(b,sizeof(b),0);
     kt:=true;
     for i:=1 to 8 do
         for j:=0 to 3 do
             if r[i] or p[j]=r[i] then
                b[1,i]:=b[1,i]+a[j,1];
     t:=1;
     for i:=2 to n do
     begin
          t:=i mod 2;
          for j:=1 to 8 do
          begin
               b[t,j]:=-maxlongint;
               for k:=1 to 8 do
                   if r[j] and r[k] = 0 then
                   begin
                        max:=b[1-t,k];
                        for q:=0 to 3 do
                            if r[j] or p[q] = r[j] then
                               max:=max+a[q,i];
                        if max>b[t,j] then
                        begin
                             b[t,j]:=max;
                             tr[i,j]:=k;
                        end;
                   end;
           end;
     end;
     re:=b[t,1]; k:=1;
     for i:=2 to 8 do
         if b[t,i]>re then
         begin
              re:=b[t,i];
              k:=i;
         end;
     i:=n;
     if k=1 then
     begin
          while (k=1) and (i>0) do
          begin
               k:=tr[i,k];
               dec(i);
          end;
          if (i=0) then kt:=false;
     end;
end;

procedure wf;
var i,j:longint;
begin
     assign(output,fo);
     rewrite(output);
     if not kt then
     begin
          re:=-maxlongint;
          for i:=0 to 3 do
              for j:=1 to n do
                  if a[i,j]>re then re:=a[i,j];
     end;
     write(re);
     close(output);
end;

begin
     rf;
     pr;
     wf;
end.

Download