QBSELECT - VOI06 Chọn ô
Tác giả: ll931110
Ngôn ngữ: Pascal
{$MODE DELPHI}
Program QBSELECT;
Const
input = '';
output = '';
Var
a: array[0..4,1..10000] of integer;
F: array[0..15,1..10000] of integer;
power: array[0..3] of integer;
stack: array[0..15,1..4] of integer;
n,max: integer;
Procedure init;
Var
fi: text;
i,j: integer;
Begin
Fillchar(a, sizeof(a), 0);
Assign(fi, input);
Reset(fi);
Readln(fi, n);
max:= -32000;
For i:= 1 to 4 do
For j:= 1 to n do
Begin
Read(fi, a[i,j]);
If max < a[i,j] then max:= a[i,j];
End;
Close(fi);
End;
Procedure pwr;
Var
i: integer;
Begin
power[0]:= 1;
For i:= 1 to 3 do power[i]:= power[i - 1] shl 1;
End;
Procedure adj;
Var
i,j,k: integer;
Begin
For i:= 0 to 15 do
If i and (i shl 1) = 0 then
Begin
j:= 0;
For k:= 0 to 3 do
if (i and power[k]) = power[k] then
Begin
inc(j);
stack[i,j]:= k + 1;
End;
End;
End;
Procedure optimize;
Var
i,j,k,s,tmp: integer;
Begin
Fillchar(F, sizeof(F), 0);
For i:= 0 to 15 do
For j:= 1 to 4 do F[i,1]:= F[i,1] + a[stack[i,j],1];
For k:= 2 to n do
For i:= 0 to 15 do if (i and (i shl 1) = 0) then
Begin
F[i,k]:= low(integer);
For j:= 0 to 15 do
if (i and j = 0) and (j and (j shl 1) = 0) then
Begin
tmp:= F[j,k - 1];
If F[i,k] < tmp then F[i,k]:= tmp;
End;
For s:= 1 to 4 do F[i,k]:= F[i,k] + a[stack[i,s],k];
End;
End;
Procedure solve;
Var
fo: text;
i,num: integer;
Begin
Assign(fo, output);
Rewrite(fo);
num:= 0;
For i:= 0 to 15 do if num < F[i,n] then num:= F[i,n];
If num = 0 then writeln(fo, max) else writeln(fo, num);
Close(fo);
End;
Begin
init;
pwr;
adj;
optimize;
solve;
End.