#include <stdlib.h>
#include <stdio.h>
int max_sum = 0;
int matrix_sum(int** matrix, int n, int m)
{
int i, j, sum = 0;
for (i = 0 ; i < n ; i++ )
for (j = 0 ; j < m ; j++ )
sum += matrix[i][j];
return sum;
}
void flip_row(int** matrix, int n, int m, int r)
{
int i;
for (i = 0 ; i < m ; i++ )
{
matrix[r][i] = -matrix[r][i];
}
}
void flip_col(int** matrix, int n, int m, int c)
{
int i;
for (i = 0 ; i < n ; i++ )
{
matrix[i][c] = -matrix[i][c];
}
}
int max (int a, int b)
{
if (a > b)
return a;
return b;
}
void backtrack_col(int** matrix, int n, int m, int sum, int k)
{
int tmp_sum;
max_sum = max(sum, max_sum);
if (k == n) {
return;
}
else
{
// Continue backtracking
backtrack_col(matrix, n, m, sum, k + 1);
flip_col(matrix, n, m, k);
backtrack_col(matrix, n, m, matrix_sum(matrix, n, m), k + 1);
}
}
void backtrack_row (int** matrix, int n, int m, int sum, int k)
{
int tmp_sum;
max_sum = max(sum, max_sum);
if (k == n ) {
return;
}
else
{
// Do backtracking for the columns
backtrack_col(matrix, n, m, sum, 0);
flip_row(matrix, n, m, k);
backtrack_col(matrix, n, m, matrix_sum(matrix, n, m), 0);
flip_row(matrix, n, m, k);
// Continue backtracking
backtrack_row(matrix, n, m, sum, k + 1);
flip_row(matrix, n, m, k);
backtrack_row(matrix, n, m, matrix_sum(matrix, n, m), k + 1);
}
}
int main(int argc, char** argv)
{
int n, m, i, j, sum;
int **matrix;
FILE *in, *out;
in = fopen("flip.in", "r");
out = fopen("flip.out", "w");
fscanf(in, "%d %d", &n, &m);
matrix = malloc( n * sizeof( int* ) );
for (i = 0 ; i < n ; i++ )
matrix[i] = malloc( m * sizeof( int ) );
for (i = 0 ; i < n ; i++ )
for (j = 0 ; j < m ; j++ )
fscanf(in, "%d", &matrix[i][j]);
sum = matrix_sum(matrix, n, m);
max_sum = sum;
backtrack_row(matrix, n, m, sum, 0);
printf("%d\n", max_sum);
fprintf(out, "%d", max_sum);
fclose(in);
fclose(out);
}