#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 16
/*
int suma_l(int tab[MAX][MAX], int max, int lin) {
int i, suma = 0;
for(i=0; i<max; i++)
suma += tab[lin][i];
return suma;
}
int suma_c(int tab[MAX][MAX], int max, int col) {
int i, suma = 0;
for(i=0; i<max; i++)
suma += tab[i][col];
return suma;
}
void invert_l(int tab[MAX][MAX], int max, int lin) {
int i;
//clock_t begin = clock();
for(i=0; i<max; i++)
tab[lin][i] = tab[lin][i] * -1;
// printf ( "time to invert line = %f\n", ( (double)clock() - begin ) );
}
void invert_c(int tab[MAX][MAX], int max, int col) {
int i;
for(i=0; i<max; i++)
tab[i][col] = tab[i][col] * -1;
}
*/
void print_tab(int **tab, int maxl, int maxc) {
int i, j;
for (i=0; i<maxl; i++) {
for(j=0; j<maxc; j++)
printf("%4d", tab[i][j]);
printf("\n");
}
printf("\n");
}
void read_Flip(int **tab, int *N, int *M, char *filename) {
int i,j;
FILE *f1 = fopen(filename, "r");
fscanf(f1, "%d", N);
fscanf(f1, "%d", M);
tab = (int**)malloc(*N * sizeof(int*));
for(i = 0; i < *N; i++)
tab[i] = (int*)malloc(*M * sizeof(int));
//printf("N=%d; M=%d\n", *N, *M);
for(i=0; i<*N; i++)
for(j=0; j<*M; j++)
fscanf(f1, "%d", &tab[i][j]);
print_tab(tab, *N, *M);
fclose(f1);
}
/*
int suma_tot(int tab[MAX][MAX], int n, int m) {
int i, j, suma=0;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
suma += tab[i][j];
return suma;
}
*/
void write_suma(int suma, char *filename) {
FILE *f2 = fopen(filename, "w");
fprintf(f2, "%d\n", suma);
fclose(f2);
}
/*
void copy(int Flip[MAX][MAX], int F[MAX][MAX], int N, int M) {
int i, j;
clock_t begin = clock();
for (i=0; i<N; i++)
for(j=0; j<M; j++)
F[i][j] = Flip[i][j];
printf ( "time to copy : %f\n", ( (double)clock() - begin ) );
}
*/
int verify_each(int **Flip, int N, int M, int imin, int jmin, int max) {
int suma1, suma2;
int max_tmp;
// printf("imin=%d jmin=%d MAX = %d\n", imin, jmin, max);
// print_tab(Flip, N, M);
//max_tmp = suma_tot(Flip, N, M);
int i, j, suma=0;
for(i=0; i<N; i++)
for(j=0; j<M; j++)
suma += Flip[i][j];
max_tmp = suma;
if(max > max_tmp)
max_tmp = max;
if(imin<N) {
/*
suma1 = verify_each(Flip, N, M, imin+1, jmin, max_tmp);
if(suma1>max_tmp)
max_tmp = suma1;
// */
//printf("max_tmp = %d ---- imin=%d\n", max_tmp, imin);
for(j=0; j<M; j++) Flip[imin][j] = -Flip[imin][j];
suma1 = verify_each(Flip, N, M, imin+1, jmin, max_tmp);
if(suma1>max_tmp)
max_tmp = suma1;
for(j=0; j<M; j++) Flip[imin][j] = -Flip[imin][j];
//printf("max_tmp = %d ---- imin=%d\n", max_tmp, imin);
}
if(jmin<M) {
/*
suma2 = verify_each(Flip, N, M, imin, jmin+1, max_tmp);
if(suma2>max_tmp)
max_tmp = suma2;
*/
//printf("max_tmp j = %d\n", max_tmp);
for(i=0; i<N; i++) Flip[i][jmin] = -Flip[i][jmin];
suma2 = verify_each(Flip, N, M, imin, jmin+1, max_tmp);
if(suma2>max_tmp)
max_tmp = suma2;
for(i=0; i<N; i++) Flip[i][jmin] = -Flip[i][jmin];
//printf("max_tmp j = %d\n", max_tmp);
}
return max_tmp;
}
int backtrack(int **Flip, int N, int M, int imin, int jmin, int max) {
int suma1, suma2;
int max_tmp;
// printf("imin=%d jmin=%d MAX = %d\n", imin, jmin, max);
// print_tab(Flip, N, M);
//max_tmp = suma_tot(Flip, N, M);
int i, j, suma=0;
for(i=0; i<N; i++)
for(j=0; j<M; j++)
suma += Flip[i][j];
max_tmp = suma;
if(max > max_tmp)
max_tmp = max;
for (i=N-1; i>imin; i--) {
for (j=M-1; j>jmin; j--) {
suma1 = verify_each(Flip, N, M, i, j, max_tmp);
if(suma1 > max_tmp)
max_tmp = suma1;
}
}
return max_tmp;
/*
if(imin<N) {
/*
suma1 = verify_each(Flip, N, M, imin+1, jmin, max_tmp);
if(suma1>max_tmp)
max_tmp = suma1;
/
//printf("max_tmp = %d ---- imin=%d\n", max_tmp, imin);
for(j=0; j<M; j++) Flip[imin][j] = -Flip[imin][j];
suma1 = verify_each(Flip, N, M, imin+1, jmin, max_tmp);
if(suma1>max_tmp)
max_tmp = suma1;
for(j=0; j<M; j++) Flip[imin][j] = -Flip[imin][j];
//printf("max_tmp = %d ---- imin=%d\n", max_tmp, imin);
}
if(jmin<M) {
/*
suma2 = verify_each(Flip, N, M, imin, jmin+1, max_tmp);
if(suma2>max_tmp)
max_tmp = suma2;
/
//printf("max_tmp j = %d\n", max_tmp);
for(i=0; i<N; i++) Flip[i][jmin] = -Flip[i][jmin];
suma2 = verify_each(Flip, N, M, imin, jmin+1, max_tmp);
if(suma2>max_tmp)
max_tmp = suma2;
for(i=0; i<N; i++) Flip[i][jmin] = -Flip[i][jmin];
//printf("max_tmp j = %d\n", max_tmp);
}
return max_tmp;
*/
}
int main() {
int N, M, suma, change, i, j;
int **Flip;
clock_t start = clock();
//read_Flip(Flip, &N, &M, "flip.in");
FILE *f1 = fopen("flip.in", "r");
fscanf(f1, "%d", &N);
fscanf(f1, "%d", &M);
Flip = (int**)malloc(N * sizeof(int*));
for(i = 0; i < N; i++)
Flip[i] = (int*)malloc(M * sizeof(int));
//printf("N=%d; M=%d\n", *N, *M);
for(i=0; i<N; i++)
for(j=0; j<M; j++)
fscanf(f1, "%d", &Flip[i][j]);
//print_tab(Flip, N, M);
fclose(f1);
change = 0;
for(i=0; i<N; i++)
for(j=0; j<M; j++)
change += Flip[i][j];
// suma = verify_each(Flip, N, M, 0, 0, change);
suma = backtrack(Flip, N, M, 0, 0, change);
write_suma(suma, "flip.out");
printf ( "%f\n", ( (double)clock() - start ) / CLOCKS_PER_SEC );
// printf ( "%f\n", ( (double)clock() - start ) );
return 0;
}