#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#define MAX_ROWS 16
#define MAX_COL 16
namespace Global {
long maxSum; long matrix[MAX_ROWS][MAX_COL];
unsigned int n, m;
vector<int> column, row;
}
void setMaxSum (long sum) { if (sum > Global::maxSum) Global::maxSum = sum; }
long getMaxSum () { return Global::maxSum; }
template<class T>
void show (const vector<T>& v) { for (int i = 0; i < v.size(); i++) cout << v[i] << " "; cout << endl; }
void readMatrix (long matrix[][MAX_COL], unsigned int& n, unsigned int& m)
{
ifstream fin ("flip.in");
fin >> n;
fin >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
fin >> matrix[i][j];
fin.close();
}
long sumMatrix (long matrix[][MAX_COL], unsigned int n, unsigned int m)
{
long sum = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
sum += matrix[i][j];
}
}
return sum;
}
long sumRow (long matrix[][MAX_COL], unsigned int n, unsigned int m, int row)
{
long sum = 0;
for (int i = 0; i < m; i++) {
sum += matrix[row][i];
}
return sum;
}
long sumColumn (long matrix[][MAX_COL], unsigned int n, unsigned int m, int column)
{
long sum = 0;
for (int i = 0; i < n; i++) {
sum += matrix[i][column];
}
return sum;
}
void flipRow (long matrix[][MAX_COL], unsigned int n, unsigned int m, int row)
{
for (int i = 0; i < m; i++) {
matrix[row][i] *= -1;
}
}
void flipColumn (long matrix[][MAX_COL], unsigned int n, unsigned int m, int column)
{
for (int i = 0; i < n; i++) {
matrix[i][column] *= -1;
}
}
void showMatrix (long matrix[][MAX_COL], unsigned int n, unsigned int m)
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
}
template<class T>
void flipAllRows (vector<T>& result, const vector<T>& values, unsigned int resultSize, unsigned int pos = 0)
{
for (int i = 0; i < values.size(); i++)
{
result.at(pos) = values[i];
if (pos < resultSize-1) {
flipAllRows (result, values, resultSize, pos+1);
}
else {
for (int j = 0; j < result.size(); j++)
if (result[j] == -1)
flipRow (Global::matrix, Global::n, Global::m, j);
setMaxSum (sumMatrix (Global::matrix, Global::n, Global::m));
for (int j = 0; j < result.size(); j++)
if (result[j] == -1)
flipRow (Global::matrix, Global::n, Global::m, j);
}
}
}
template<class T>
void flipAllColumns (vector<T>& result, const vector<T>& values, unsigned int resultSize, unsigned int pos = 0)
{
for (int i = 0; i < values.size(); i++)
{
result.at(pos) = values[i];
if (pos < resultSize-1) {
flipAllColumns (result, values, resultSize, pos+1);
}
else {
for (int j = 0; j < result.size(); j++)
if (result[j] == -1)
flipColumn (Global::matrix, Global::n, Global::m, j);
//cout << sumMatrix (Global::matrix, Global::n, Global::m) << " ";
// TODO: function
flipAllRows(Global::row, values, resultSize);
for (int j = 0; j < result.size(); j++)
if (result[j] == -1)
flipColumn (Global::matrix, Global::n, Global::m, j);
}
}
}
int main()
{
using Global::matrix;
using Global::m;
using Global::n;
using Global::column;
using Global::row;
vector<int> values;
values.push_back(1);
values.push_back(-1);
readMatrix (matrix, n, m);
showMatrix (matrix, n, m);
Global::maxSum = sumMatrix (matrix, n, m);
row.resize(n); column.resize(m);
cout << endl;
flipAllColumns (column, values, m);
fstream fout ("flip.out");
fout << getMaxSum();
fout.close();
return 0;
}