Cod sursa(job #8296)

Utilizator wefgefAndrei Grigorean wefgef Data 24 ianuarie 2007 11:03:35
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <string.h>
#include <algorithm>

using namespace std;

#define inf 1000000000 //un miliard

int n, m, r, c, best = inf, a[16][2048], sum[2048], sum2[2048], st[16];

void readdata()
{
	freopen("elimin.in", "r", stdin);
	freopen("elimin.out", "w", stdout);
	
	int i, j, val;
	
	scanf("%d %d %d %d", &n, &m, &r, &c);
	for (i = 0; i < n; ++i)
		for (j = 0; j < m; ++j)
			{
				scanf("%d", &val);
				if (n < m) a[i][j] = val;
					else a[j][i] = val;
			}
	if (n < m) swap(n, m), swap(r, c);
}

void eval()
{
	int i, j, rez = 0;
	
	memcpy(sum2, sum, sizeof(sum));
	for (i = 1; i <= r; ++i)
		for (j = 0; j < m; ++j)
		{
			sum2[j] -= a[st[i]][j];
			rez += a[st[i]][j];
		}
	sort(sum2, sum2+m);
	for (i = 0; i < c; ++i)
		rez += sum2[i];
	best = min(rez, best);
}

void back(int k)
{
	if (k > r)
	{
		eval();
		return;
	}
	for (int i = st[k-1] + 1; i < n-(r-k); ++i)
	{
		st[k] = i;
		back(k+1);
	}
}

void solve()
{
	int i, j, s = 0;
	
	for (j = 0; j < m; ++j)
		for (i = 0; i < n; ++i)
		{
			sum[j] += a[i][j];
			s += a[i][j];
		}
	st[0] = -1;
	back(1);
	printf("%d\n", s-best);
}

int main()
{
	readdata();
	solve();
	return 0;
}