Cod sursa(job #1602116)

Utilizator DoubleNyNinicu Cristian DoubleNy Data 16 februarie 2016 15:56:45
Problema Jocul Flip Scor 30
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.77 kb
type vector=array[1..20] of longint;
     tabel=array[1..20,1..20] of longint;
var  v,q:vector;
     maxtab,tab:tabel;
     n,m,i,j,maxsum,c:longint;


 procedure flipcol;
 var sum,i1:longint;
  begin
       sum:=0;
       for j:=1 to c do
        begin
            for i:=1 to n do
            sum:=sum+maxtab[i,j];
            if sum<0 then
              begin
               for i1:=1 to n do
               maxtab[i1,j]:=maxtab[i1,j]*(-1);
              end;
            sum:=0;
        end;
       maxsum:=0;
       for i:=1 to n do
       for j:=1 to c do maxsum:=maxsum+maxtab[i,j];
 end;

 procedure flip(x:tabel);
 var i,j,sum:longint;
   begin
      sum:=0;
       for i:=1 to m do
       for j:=1 to c do
        x[q[i],j]:=x[q[i],j]*(-1);

       for i:=1 to n do
       for j:=1 to c do
        sum:=sum+x[i,j];
      if sum>maxsum then
       begin
          for i:=1 to n do
          for j:=1 to c do maxtab[i,j]:=x[i,j];
         maxsum:=sum;
       end;
     flipcol;
   end;


 procedure back(k:longint);
 var i:longint;
 begin
     flip(tab);
       if k<=n then
        for i:=k to n do
        begin
          inc(m);
          q[m]:=v[i];
          back(i+1);
          dec(m);
        end;

 end;



begin
     assign(input,'flip.in'); reset(input);
     maxsum:=0;
     fillchar(maxtab,sizeof(maxtab),0);
     m:=0;
     readln(input,n,c);
     for i:=1 to n do
      for j:=1 to c do read(tab[i,j]);


     //for i:=1 to n do
       //begin
         //   for j:=1 to c do write(tab[i,j],' ');
           // writeln;
     //  end;

     for i:=1 to n do v[i]:=i;
     back(1);
     close(input);
     assign(output,'flip.out'); rewrite(output);
     write(output,maxsum);
     close(output);


end.