#include <stdlib.h>
#include <stdio.h>
#include <math.h>
void freeBackup(int** backup, int n)
{
int i;
for(i = 0; i < n; i++){
free(backup[i]);
}
free(backup);
}
int calculeaza(int** tabla, int n, int m)
{
int s = 0;
int i,j;
for( i = 0; i < n; i++){
for(j = 0; j < m; j++){
s += tabla[i][j];
}
}
return s;
}
void rezolvaColoanele(int** tabla, int n, int m){
int suma = 0;
int sumaPeMinus = 0;
int i, j;
for(j = 0; j < m; j++){
suma = 0;
sumaPeMinus = 0;
for(i = 0; i < n; i++){
suma += tabla[i][j];
sumaPeMinus += (-tabla[i][j]);
}
if(sumaPeMinus > suma){
for(i = 0; i < n; i++){
tabla[i][j] = (-tabla[i][j]);
}
}
}
}
void apasaButoane2(int** backup, int* digits, int n, int m)
{
int indexParcurgere = 0;
int j;
while(indexParcurgere < n){
if(digits[indexParcurgere] != 0){
if(indexParcurgere < n){
for(j = 0; j < m; j++){
backup[indexParcurgere][j] *= (-1);
}
}
else{
for(j = 0; j < n; j++){
backup[j][indexParcurgere - n] *= (-1);
}
}
}
indexParcurgere++;
}
}
void findMax2(int** tabla, int n, int m)
{
int index = 0;
int* digits = (int*)calloc(n, sizeof(int));
int nrButoane = n;
int max = calculeaza(tabla, n, m);
index = 1;
int i;
int nrCaz = pow(2, nrButoane);
int cazulGasit = 0;
while(index != nrCaz){
i = 0;
while(digits[i] == 1 && i <= (nrButoane - 1) ){
digits[i++] = 0;
}
digits[i] = 1;
apasaButoane2(tabla, digits, n, m);
int x = calculeaza(tabla, n, m);
apasaButoane2(tabla, digits, n, m);
if(x > max){
max = x;
cazulGasit = index;
}
index++;
}
free(digits);
digits = (int*)calloc(n, sizeof(int));
if(cazulGasit == 0){
rezolvaColoanele(tabla, n, m);
max = calculeaza(tabla, n, m);
}
else{
index = 1;
while(index <= cazulGasit){
i = 0;
while(digits[i] == 1 && i <= (nrButoane - 1) ){
digits[i++] = 0;
}
digits[i] = 1;
index++;
}
}
apasaButoane2(tabla, digits, n, m);
rezolvaColoanele(tabla, n, m);
max = calculeaza(tabla, n, m);
FILE* output = fopen("flip.out", "a");
fprintf(output, "%i", max);
free(digits);
fclose(output);
}
int main()
{
int n, m;
FILE* input;
input = fopen("flip.in", "r");
int i, j;
fscanf(input, "%i", &n);
fscanf(input, "%i", &m);
int** tabla;
tabla = (int**)calloc(n, sizeof(int*));
for(i = 0; i < n; i++){
tabla[i] = (int*)calloc(m, sizeof(int));
}
for(i = 0; i < n; i++){
for(j = 0; j < m; j++){
fscanf(input, "%i", &(tabla[i][j]) );
}
}
findMax2(tabla, n, m);
freeBackup(tabla, n);
fclose(input);
return 0;
}