#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void flip (int **mat, int m, int n, int k, bool row) {
if (row) {
for (int i = 0; i < n; i++) {
mat[k][i] = -mat[k][i];
}
} else {
for (int i = 0; i < m; i++) {
mat[i][k] = -mat[i][k];
}
}
}
void print (int **mat, int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", mat[i][j]);
}
printf("\n");
}
}
void sums (int **mat, int m, int n) {
for (int i = 0; i < m; i++) {
int s = 0;
for (int j = 0; j < n; j++) {
s += mat[i][j];
}
mat[i][n] = s;
}
for (int j = 0; j < n; j++) {
int s = 0;
for (int k = 0; k < m; k++) {
s += mat[k][j];
}
mat[m][j] = s;
}
}
int sum (int **mat, int m, int n) {
int s = 0;
for (int i = 0; i < m; i++) {
s += mat[i][n];
}
return s;
}
void optimize (int **mat, int m, int n) {
sums(mat, m, n);
int s = sum(mat, m, n);
printf("%d\n", s);
print (mat, m, n);
for (int i = 0; i < m; i++) {
flip(mat, m, n, i, true);
sums(mat, m, n);
int sn = sum(mat, m, n);
if (sn > s) {
printf ("%d > %d; going in with %d\n", sn, s, sn);
optimize(mat, m, n);
return;
} else {
flip(mat, m, n, i, true);
}
}
printf("no opt on cols s=%d\n", s);
for (int j = 0; j < n; j++) {
flip(mat, m, n, j, false);
sums(mat, m, n);
int sn = sum(mat, m, n);
if (sn > s) {
printf ("%d > %d\n", sn, s);
optimize(mat, m, n);
return;
} else {
flip(mat, m, n, j, false);
}
}
}
int main (void) {
FILE *in = fopen("flip.in", "r");
FILE *out = fopen("flip.out", "w");
int m, n;
fscanf(in, "%d %d", &m, &n);
int **mat = new int * [m+1];
for (int i = 0; i < m + 1; i++) {
mat[i] = new int[n+1];
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n - 1; j++) {
fscanf(in, "%d ", &mat[i][j]);
}
fscanf(in, "%d\n", &mat[i][n-1]);
}
optimize(mat, m, n);
sums(mat, m, n);
fprintf(out, "%d", sum(mat, m, n));
return 0;
}