Cod sursa(job #377923)

Utilizator ooctavTuchila Octavian ooctav Data 26 decembrie 2009 21:29:43
Problema Elimin Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cstdio>
#include <algorithm>
#define NMAX 551
#define MMAX 552
int M,N,R,C;
int A[MMAX][NMAX];
int SC[NMAX];
int e[NMAX-1];
bool val[NMAX];
int SUMA;
int REZULTAT=0;

void citire()
{
	scanf("%d %d %d %d",&M,&N,&R,&C);
	for(int i=1;i<=M;i++)
		for(int j=1;j<=N;j++)
		{
			scanf("%d",&A[i][j]);
			SC[j]=SC[j]+A[i][j];
			SUMA=SUMA+A[i][j];
		}
}

inline void executa()
{
	int s=SUMA,sume[MMAX];
	
	for(int i=0;i<=M;i++)
		sume[i]=0;
	
	for(int i=1;i<=e[0];i++)
		s=s-SC[e[i]];
	
	for(int i=1;i<=M;i++)
		for(int j=1;j<=N;j++)
			if(!val[j])
				sume[i]=sume[i]+A[i][j];
	std::sort(sume,sume+M+1);
	for(int i=1;i<=R;i++)
		s=s-sume[i];
	if(s>REZULTAT)
		REZULTAT=s;
}

inline void back()
{
	if(e[0]==C)
	{
		executa();
		e[0]--;
		return;
	}
	for(int i=e[e[0]]+1;i<=N;i++)
	{
		val[i]=1;
		e[++e[0]]=i;
		back();
		val[i]=0;
	}
	e[0]--;
}

int main()
{
	freopen("elimin.in","r",stdin);
	freopen("elimin.out","w",stdout);
	citire();
	back();
	printf("%d",REZULTAT);
	
	return 0;
}