#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int N,M,max=-256000001;
FILE *g=fopen("flip.out","wt");
struct nod
{
int info[16][16];
nod *adr_urm;
};
nod *cap,*coada;
void PUSH(nod *&cap,nod *&coada,int m[16][16])
{
if(!cap)
{
nod *g=(nod *)malloc(1*sizeof(nod));
g->adr_urm=NULL;
memcpy(g->info,m,sizeof(g->info));
cap=g;
coada=g;
return;
}
nod *p=(nod *)malloc(1*sizeof(nod));
memcpy(p->info,m,sizeof(p->info));
coada->adr_urm=p;
coada=p;
return;
}
int gasit(nod *cap,nod *curent,int m[16][16])
{
for(nod *c=cap;c!=curent;c=c->adr_urm)
if(memcmp(c->info,m,sizeof(c->info)) == 0)
return 0;
return 1;
}
void flip_column(int coloana,int m[16][16])
{
int i;
for(i=0;i<N;++i)
m[i][coloana]*=-1;
}
void flip_row(int rand,int m[16][16])
{
int j;
for(j=0;j<M;++j)
m[rand][j]*=-1;
}
int suma_matrice(int m[16][16])
{
int i,j,sum=0;
for(i=0;i<N;++i)
for(j=0;j<M;++j)
sum+=m[i][j];
return sum;
}
void arata_configuratie(int m[16][16])
{
for(int i=0;i<N;++i)
{
for(int j=0;j<M;++j)
fprintf(g,"%i ",m[i][j]);
fprintf(g,"\n");
}
fprintf(g,"\n");
}
int main()
{
int i,j,m[16][16],NR;
FILE *f=fopen("flip.in","rt");
fscanf(f,"%i%i",&N,&M);
for(i=0;i<N;++i)
for(j=0;j<M;++j)
fscanf(f,"%i",&m[i][j]);
fclose(f);
PUSH(cap,coada,m);
nod *curent=cap;
while(curent)
{
// fprintf(g,"Prelucrarea pt matricea:\n");arata_configuratie(curent->info);
NR=suma_matrice(curent->info);
NR > max ? max=NR:1;
for(i = 0;i<N;++i)
{
memcpy(m,curent->info,sizeof(m));
flip_row(i,m);
if(gasit(cap,curent,m))
{
PUSH(cap,coada,m);
// arata_configuratie(m);
}
}
for(j=0;j<M;++j)
{
memcpy(m,curent->info,sizeof(m));
flip_column(j,m);
if(gasit(cap,curent,m))
{
PUSH(cap,coada,m);
//arata_configuratie(m);
}
}
curent = curent->adr_urm;
}
fprintf(g,"%i",max);
return 0;
}