Cod sursa(job #7430)

Utilizator CezarMocanCezar Mocan CezarMocan Data 21 ianuarie 2007 15:34:37
Problema Elimin Scor 40
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.7 kb
var s:array[0..20]of integer;
    v:array[0..900,0..900]of integer;
    x:array[0..900]of integer;
    i,j,n,m,r,c,stot,max:longint;

procedure back(k,nr:longint);
var i,j,ss,min,lim:longint;
    ok:boolean;
begin
if k=nr then
        begin
        if nr=r then
                begin
                ss:=stot;
                for i:=1 to n do
                        x[i]:=v[0,i];
                for i:=1 to nr do
                        for j:=1 to n do
                                dec(x[j],v[s[i],j]);
                for i:=1 to nr do
                        ss:=ss-v[s[i],0];
                for i:=1 to c do
                        begin
                        min:=1;
                        for j:=2 to n do
                                if x[j]<x[min] then
                                        min:=j;
                        ss:=ss-x[min];
                        x[min]:=maxint;
                        end;
                if ss>max then
                        max:=ss;
                end
        else
                begin
                ss:=stot;
                for i:=1 to m do
                        x[i]:=v[i,0];
                for i:=1 to nr do
                        for j:=1 to m do
                                dec(x[j],v[j,s[i]]);
                for i:=1 to nr do
                        ss:=ss-v[0,s[i]];
                for i:=1 to r do
                        begin
                        min:=1;
                        for j:=2 to m do
                                if x[j]<x[min] then
                                        min:=j;
                        ss:=ss-x[min];
                        x[min]:=maxint;
                        end;
                if ss>max then
                        max:=ss;
                end;
        end
else
        begin
        lim:=m;
        if nr=c then
                lim:=n;
        for i:=1 to lim do
                begin
                s[k+1]:=i;
                ok:=true;
                for j:=1 to k do
                        if s[j]=s[k+1] then
                                ok:=false;
                if ok then
                        back(k+1,nr);
                end;
        end;
end;

begin
assign(input,'elimin.in');reset(input);
assign(output,'elimin.out');rewrite(output);
readln(m,n,r,c);
for i:=1 to m do
        for j:=1 to n do
                begin
                read(v[i,j]);
                inc(v[i,0],v[i,j]);
                stot:=stot+v[i,j];
                end;
for i:=1 to n do
        for j:=1 to m do
                inc(v[0,i],v[j,i]);
if r<c then
        back(0,r)
else
        back(0,c);
writeln(max);
close(input);close(output);
end.