Cod sursa(job #65686)

Utilizator alextheroTandrau Alexandru alexthero Data 11 iunie 2007 15:41:10
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#include <algorithm>

#define nmax 1001

using namespace std;

int b[nmax][nmax],a[nmax][nmax],rez = 0,n,m,i,j,r,c,d[nmax],aux[nmax];

void inversare() {
	for(int i = 1; i <= m; i++)
		for(int j = 1; j <= n; j++) b[j][m - i + 1] = a[i][j];
	n ^= m ^= n ^= m; r ^= c ^= r ^= c;
	for(int i = 1; i <= m; i++)
		for(int j = 1; j <= n; j++)
			a[i][j] = b[i][j];
}

void baga() {
	d[0] = 0;
	for(int j = 1; j <= n; j++) {
		int sum = 0;
		for(int i = 1; i <= m; i++)
			if(aux[i] == 0) sum += a[i][j];
		d[++d[0]] = sum;
	}
	sort(d + 1,d + d[0]);
	int sum = 0;
	for(int i = c + 1; i <= d[0]; i++) sum += d[i];
	if(sum > rez) rez = sum;
}

void back(int x,int p) {
	if(p > r) return ;
	for(int i = 0; i < 2; i++) {
		aux[x] = i;
		if(x == m) {
			if(p + aux[x] == r) baga();
		}
		else back(x + 1,p + aux[x]);
	}
}

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

	scanf("%d%d%d%d",&m,&n,&r,&c);
	for(i = 1; i <= m; i++) 
		for(j = 1; j <= n; j++)
			scanf("%d",&a[i][j]);

	if(m > n) inversare();
	back(1,0);

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

	return 0;
}