C11ROOKS - Hai quân xe

Tác giả: ladpro98

Ngôn ngữ: Pascal

program c11rooks;
uses    math;
const   maxn=303;
        fi='';
var     a:array[1..maxn,1..maxn] of longint;
        row,col,s1,s2:array[1..maxn] of longint;
        n,res:longint;

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

procedure init;
var     i,j:longint;
begin
        res:=low(longint);
        for i:=1 to n do
        begin
                row[i]:=0;
                for j:=1 to n do
                inc(row[i],a[i,j]);
        end;
        for j:=1 to n do
        begin
                col[j]:=0;
                for i:=1 to n do
                inc(col[j],a[i,j]);
        end;
end;

procedure process;
var     i,j,k,t,max1,max2:longint;
begin
        for i:=1 to n do
        begin
                for k:=1 to n-1 do
                for j:=k+1 to n do
                res:=max(res,row[i]+col[k]+col[j]-2*a[i,k]-2*a[i,j]);
                for j:=i+1 to n do
                begin
                        t:=row[i]+row[j];
                        for k:=1 to n do
                        begin
                                res:=max(res,t+col[k]-2*a[i,k]-2*a[j,k]);
                                s1[k]:=col[k]-2*a[i,k]-a[j,k];
                                s2[k]:=col[k]-a[i,k]-2*a[j,k];
                        end;
                        max1:=s1[1];max2:=s2[1];
                        for k:=2 to n do
                        begin
                                res:=max(res,t+s2[k]+max1);
                                res:=max(res,t+s1[k]+max2);
                                max1:=max(max1,s1[k]);
                                max2:=max(max2,s2[k]);
                        end;
                end;
        end;
end;

begin
        input;
        init;
        process;
        write(res);
end.

Download