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.