Cod sursa(job #1816895)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 27 noiembrie 2016 04:14:49
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <climits>

#ifdef INFOARENA
#define ProblemName "flip"
#endif

#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif

typedef long long LL;
#define MAXN 20
int mat[MAXN][MAXN];
int N, M;

LL sumCol(int colNum, int msk) {
	LL ans = 0LL;
	for (int i = 0; i < N; ++i)
		ans += ((msk & i) ? (-mat[i][colNum]) : mat[i][colNum]);
	return (ans < 0LL) ? (-ans) : ans;
}

LL sumLine(int lineNum, int msk) {
	LL ans = 0LL;
	for (int i = 0; i < N; ++i)
		ans += ((msk & i) ? (-mat[lineNum][i]) : mat[lineNum][i]);
	return (ans < 0LL) ? (-ans) : ans;
}

int main() {
	freopen(InFile, "r", stdin);
	freopen(OuFile, "w", stdout);
	scanf("%d%d", &N, &M);
	for (int i = 0; i < N; ++i)
	for (int j = 0; j < M; ++j)
		scanf("%d", &mat[i][j]);
	int lim = (1 << N);
	LL best = LLONG_MIN;
	for (int msk = 0; msk < lim; ++msk) {
		LL candidate = 0LL;
		for (int i = 0; i < M; ++i)
			candidate += sumCol(i, msk);
		if (candidate > best) best = candidate;
	}
	lim = (1 << M);
	for (int msk = 0; msk < lim; ++msk) {
		LL candidate = 0LL;
		for (int i = 0; i < N; ++i)
			candidate += sumLine(i, msk);
		if (candidate > best) best = candidate;
	}
	printf("%lld\n", best);
	return 0;
}