Cod sursa(job #377936)

Utilizator ooctavTuchila Octavian ooctav Data 26 decembrie 2009 22:38:53
Problema Elimin Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define NMAX 551
#define MMAX 552
void schimb(int a,int b);
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(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];
			}
	else
	{
		for(int i=1;i<=M;i++)
			for(int j=1;j<=N;j++)
			{
				scanf("%d",&A[j][i]);
				SC[j]+=A[j][i];
				SUMA+=A[j][i];
			}
		schimb(N,M);
		schimb(R,C);
	}
}

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

void schimb(int a ,int b)
{
	int x=a;
	a=b;
	b=x;
}