Cod sursa(job #2434441)

Utilizator RobertLISARURobert Lisaru RobertLISARU Data 1 iulie 2019 21:19:35
Problema Jocul Flip Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include "Source.h"

class Flip {
	private:
	int **t;
	int n, m;
	int sum;
	int maxSum;

	void flipLine(int line) {
		for (int j = 0; j < m; j++) {
			sum -= t[line][j];
			t[line][j] *= -1;
			sum += t[line][j];
		}
	}

	void flipColumn(int column) {
		for (int i = 0; i < n; i++) {
			sum -= t[i][column];
			t[i][column] *= -1;
			sum += t[i][column];
		}
	}

	void computeMaxSum(int line, int column) {
		if (line < n) {
			computeMaxSum(line + 1, column);
			flipLine(line);
			computeMaxSum(line + 1, column);
			flipLine(line);
		}
		else if (column < m) {
			computeMaxSum(line, column + 1);
			flipColumn(column);
			computeMaxSum(line, column + 1);
			flipColumn(column);
		}
		if (sum > maxSum) {
			maxSum = sum;
		}
	}

	public:
	Flip(int **t, int n, int m) {
		this->t = t;
		this->n = n;
		this->m = m;
		sum = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				sum += t[i][j];
			}
		}
		maxSum = sum;
	}

	int getMaxSum() {
		computeMaxSum(0, 0);
		return maxSum;
	}
};

int main() {
	std::ifstream fin("flip.in");
	std::ofstream fout("flip.out");
	int n, m;
	fin >> n;
	fin >> m;
	int **t = new int*[n];
	for (int i = 0; i < n; i++) {
		t[i] = new int[m];
		for (int j = 0; j < m; j++) {
			fin >> t[i][j];
		}
	}
	Flip *f = new Flip(t, n, m);
	fout << f->getMaxSum();

	return 0;
}