Cod sursa(job #7439)

Utilizator gcosminGheorghe Cosmin gcosmin Data 21 ianuarie 2007 15:39:15
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int N, M, n1, m1;

int a[20][8000];
long long sumlin[20];
long long sumcol[8000];
long long sumca[8000];
int vec[20];

int nrb(int x)
{
	int nr = 0;

	while (x) {
		nr++;
		x &= x-1;
	}

return nr;
}

int gen(int N, int M, int n1, int m1)
{
	freopen("elimin.in", "w", stdout);

	printf("%d %d %d %d\n", N, M, n1, m1);

	int i, j;
	for (i = 1; i <= N; i++) {
		for (j = 1; j <= M; j++) printf("%d ", rand() % 32000);
		printf("\n");
	}
	
fclose(stdout);
return 0;
}

int main()
{
//	gen(521, 14, 123, 7);
	
	int i, j, k, aux, q;

	freopen("elimin.in", "r", stdin);
	freopen("elimin.out", "w", stdout);

	scanf("%d %d %d %d", &N, &M, &n1, &m1);

	long long tot = 0;

	for (i = 0; i < N; i++)
		for (j = 0; j < M; j++) 
		{
			scanf("%d", &q);
			
			tot += q;
			
			if (N <= M) a[i][j] = q, sumlin[i] += q, sumcol[j] += q;
			else a[j][i] = q, sumlin[j] += q, sumcol[i] += q;
		}

	if (N > M) {
		aux = N; N = M; M = aux; 
		aux = n1; n1 = m1; m1 = aux;
	}

	long long cur, sc, rez = 0;
	for (i = 0; i < (1 << N); i++)
	{
		if (nrb(i) != n1) continue;

		cur = tot;
		vec[0] = 0;
		for (j = 1, k = 0; j <= i; j <<= 1, k++)
			if (j & i) {
				vec[++vec[0]] = k;
				cur -= sumlin[k];
			}

		for (j = 0; j < M; j++) {
			sc = sumcol[j];

			for (k = 1; k <= vec[0]; k++)
				sc -= a[vec[k]][j];

			sumca[j] = sc;
		}

		sort(sumca, sumca + M);

		for (j = 0; j < m1; j++) cur -= sumca[j];

		if (cur > rez) rez = cur;			
	}

	printf("%lld\n", rez);

fclose(stdin);
fclose(stdout);
return 0;
}