Cod sursa(job #462979)

Utilizator alisssiaMititelu Andra alisssia Data 14 iunie 2010 11:58:56
Problema Elimin Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
using namespace std;
#include<cstdio>
int n,m,r,c,i,j,nr,a[750][750],sol[750];
long max;

void sumal()
{
	long s[750],sum=0;
	int aux;
	for(i=1;i<=n;i++)
	{
		s[i]=0;
		for(j=1;j<=m;j++)
			if(!sol[j]) s[i]=s[i]+a[j][i];
		j=i;
		while(j>=2 && s[j]>s[j-1])
		{
			aux=s[j];
			s[j]=s[j-1];
			s[j-1]=aux;
			j--;
		}
	}
	for(i=1;i<=n-c;i++)
		sum=sum+s[i];
	if(sum>max) max=sum;
}

void sumac()
{
	long s[750],sum=0;
	int aux;
	for(i=1;i<=m;i++)
	{
		s[i]=0;
		for(j=1;j<=n;j++)
			if(!sol[j]) s[i]=s[i]+a[i][j];
		j=i;
		while(j>=2 && s[j]>s[j-1])
		{
			aux=s[j];
			s[j]=s[j-1];
			s[j-1]=aux;
			j--;
		}
	}
	for(i=1;i<=m-r;i++)
		sum=sum+s[i];
	if(sum>max) max=sum;
}	


void backl(int k)
{
	if(k==m+1) sumal();
	else 
	{
		if(nr<r)
		{
			sol[k]=1;
			nr++;
			backl(k+1);
			nr--;
		}
		if(m-k>=r-nr)
		{
			sol[k]=0;
			backl(k+1);
		}
	}
}

void backc(int k)
{
	if(k==n+1) sumac();
	else 
	{
		if(nr<c)
		{
			sol[k]=1;
			nr++;
			backc(k+1);
			nr--;
		}
		if(n-k>=c-nr)
		{
			sol[k]=0;
			backc(k+1);
		}
	}
}

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(n<m) backc(1);
	else backl(1);
	printf("%li\n",max);
	return 0;
}