Cod sursa(job #677060)

Utilizator danalex97Dan H Alexandru danalex97 Data 9 februarie 2012 20:34:49
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <fstream>
using namespace std;

#define INFI 10000

int m,n,r,c;
int Maxim=INFI,Maxim2=INFI,Sum;
int a[1001][1001],Lin[INFI],Col[INFI];
int Elimin[1001],Elimin2[1001];

int main()
{
	freopen("elimin.in","r",stdin);
	freopen("elimin.out","w",stdout);
	scanf("%d%d%d%d",&m,&n,&r,&c);

	for (register int i=1;i<=m;++i)
		for (register int j=1;j<=n;++j)
		{
			scanf("%d",&a[i][j]);
			Col[j]+=a[i][j];
			Lin[i]+=a[i][j];
			Sum+=a[i][j];
		}

	int Min=(n<m)?n:m;
	
	if (n==Min)
	{
		int val=(1<<m)-1; 
		for (register int i=1;i<=val;++i)
		{
			int co=0,s=0;
			for (register int j=1,c2=1;j<=i;++c2,j=j<<1)
			{
				int val2=i&j;
				if (val2!=0)
				{
					s+=Lin[c2];
					Elimin2[++co]=c2;
				}
			}
			if (co==r && s<Maxim)
			{
				co=0;
				Maxim=s;
				for (register int j=1;j<=i;j=j<<1)
				{
					int val2=i&j;
					if (val2!=0)
						Elimin[++co]=Elimin2[co];
				}
			}
		}

		for (register int i=1;i<=r;++i)
			for (register int j=1;j<=n;++j)
				Col[j]-=a[Elimin[i]][j];

		
		val=(1<<n)-1; 
		for (register int i=1;i<=val;++i)
		{
			int co=0,s=0;
			for (register int j=1,c2=1;j<=i;++c2,j=j<<1)
			{
				int val2=i&j;
				if (val2!=0)
				{
					s+=Col[c2];
					Elimin2[++co]=c2;
				}
			}
			if (co==c && s<Maxim2)
			{
				co=0;
				Maxim2=s;
				for (register int j=1;j<=i;j=j<<1)
				{
					int val2=i&j;
					if (val2!=0)
						Elimin[++co]=Elimin2[co];
				}
			}
		}
	}

	else

	{
		int val=(1<<n)-1; 
		for (register int i=1;i<=val;++i)
		{
			int co=0,s=0;
			for (register int j=1,c2=1;j<=i;++c2,j=j<<1)
			{
				int val2=i&j;
				if (val2!=0)
				{
					s+=Col[c2];
					Elimin2[++co]=c2;
				}
			}
			if (co==c && s<Maxim)
			{
				co=0;
				Maxim=s;
				for (register int j=1;j<=i;j=j<<1)
				{
					int val2=i&j;
					if (val2!=0)
						Elimin[++co]=Elimin2[co];
				}
			}
		}

		for (register int i=1;i<=c;++i)
			for (register int j=1;j<=m;++j)
				Lin[j]-=a[j][Elimin[i]];


		val=(1<<m)-1; 
		for (register int i=1;i<=val;++i)
		{
			int co=0,s=0;
			for (register int j=1,c2=1;j<=i;++c2,j=j<<1)
			{
				int val2=i&j;
				if (val2!=0)
				{
					s+=Lin[c2];
					Elimin2[++co]=c2;
				}
			}
			if (co==r && s<Maxim2)
			{
				co=0;
				Maxim2=s;
				for (register int j=1;j<=i;j=j<<1)
				{
					int val2=i&j;
					if (val2!=0)
						Elimin[++co]=Elimin2[co];
				}
			}
		}

	}
	
	Sum-=Maxim+Maxim2;
	printf("%d\n",Sum);
	
	return 0;
}