Cod sursa(job #377920)

Utilizator ooctavTuchila Octavian ooctav Data 26 decembrie 2009 21:28:16
Problema Elimin Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <algorithm>
#define NMAX 551
#define MMAX 552
bool sch=0;
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);
	if(C>R)
		sch=1;
	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];
		}
}

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;
}

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]--;
}

void executa2()
{
	int s=SUMA,sume[MMAX];
	
	for(int i=0;i<=N;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[i])
				sume[j]=sume[j]+A[i][j];
	std::sort(sume,sume+N+1);
	for(int i=1;i<=R;i++)
		s=s-sume[i];
	if(s>REZULTAT)
		REZULTAT=s;
}

void back2()
{
	if(e[0]==R)
	{
		executa2();
		e[0]--;
		return;
	}
	for(int i=e[e[0]]+1;i<=M;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();
	if(!sch)
		back();
	else
		back2();
	printf("%d",REZULTAT);
	
	return 0;
}