Cod sursa(job #302865)

Utilizator AndreiDumaAndrei Duma AndreiDuma Data 9 aprilie 2009 12:48:46
Problema Jocul Flip Scor 30
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.3 kb
var a,c:array[1..16,1..16] of longint;
    sol:array[1..16] of byte;
    n,m,i,j,max:integer;

    f,g:text;

procedure flip ( linie:integer );
var j:integer;
begin
	for j:=1 to m do c[linie,j]:=-c[linie,j];
end;

procedure flip_col( coloana:integer );
var j:integer;
begin
	for j:=1 to n do c[j,coloana]:=-c[j,coloana];
end;

procedure procesare;
var i,j:integer;
    sum,suma_poz,suma_neg:longint;
begin
	for i:=1 to n do
	  for j:=1 to m do c[i,j]:=a[i,j];

        for i:=1 to m do if sol[i]=1 then flip_col(i);

	sum:=0;
	for i:=1 to n do
	begin
		suma_poz:=0;
                for j:=1 to m do if c[i,j]>0 then inc(suma_poz,c[i,j]);
                suma_neg:=0;
                for j:=1 to m do if c[i,j]<0 then inc(suma_neg,c[i,j]);

                if suma_poz < abs(suma_neg) then flip(i);
		for j:=1 to m do sum:=sum+c[i,j];
	end;
	
	if sum > max then max:=sum;
end;

procedure back (l:integer);
var i:integer;
begin
	if l = m then procesare
		 else
			 for i:=0 to 1 do
			 begin
			 	sol[l+1]:=i;
				back(l+1);
			 end;
end;


begin
	assign(f,'flip.in');reset(f);
	assign(g,'flip.out');rewrite(g);

	readln(f,n,m);
	for i:=1 to n do
	begin
		for j:=1 to m do read(f,a[i,j]);
		readln(f);
	end;

	back(0);

	writeln(g,max);

	close(f); close(g);
end.