#include <fstream>
const char* inFile = "flip.in";
const char* outFile = "flip.out";
void flipLine(int numLines, int numCols, int* matrix, int lineNum)
{
for (int index = 0; index < numCols; ++index)
{
matrix[lineNum * numCols + index] *= -1;
}
}
void flipCol(int numLines, int numCols, int* matrix, int colNum)
{
for (int index = 0; index < numLines; ++index)
{
matrix[index * numCols + colNum] *= -1;
}
}
int sum(int numLines, int numCols, int* matrix)
{
int sum = 0;
for (auto i = 0; i < numLines * numCols; ++i)
{
sum += matrix[i];
}
return sum;
}
int flip(int numLines, int numCols, int* matrix)
{
int maxFlip = 1 << (numLines + numCols - 1);
int* copyMatrix = new int[numLines * numCols];
int maxSum = 0;
for (int i = 0; i < maxFlip; ++i)
{
memcpy(copyMatrix, matrix, sizeof(int)*numLines*numCols);
for (int l = 0; l < numLines; ++l)
{
if ((i & 1 << l) != 0) flipLine(numLines, numCols, copyMatrix, l);
}
for (int c = 0; c < numCols; ++c)
{
if ((i & 1 << (numLines + c)) != 0) flipCol(numLines, numCols, copyMatrix, c);
}
auto currentSum = sum(numLines, numCols, copyMatrix);
if (maxSum < currentSum) maxSum = currentSum;
}
return maxSum;
}
int main()
{
int numLines = 0;
int numCols = 0;
std::ifstream readFile(inFile);
if (!readFile) return -1;
readFile >> numLines >> numCols;
int* matrix = new int[numLines*numCols];
for (int index = 0; index < numLines * numCols; ++index)
{
readFile >> matrix[index];
}
int sum = 0;
if (numLines > 0 && numCols > 0)
{
sum = flip(numLines, numCols, matrix);
}
{
std::ofstream writeFile(outFile);
writeFile << sum;
}
return 0;
}