Cod sursa(job #204365)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 23 august 2008 10:39:02
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>
#define MAX 8007
#define MIN 25
#define pow(a,b) a^=b^=a^=b
int n,m,R,C,s,sum=0;
int a[MIN][MAX],x[MAX],y[MIN];   
int v[MIN],sl[MIN],sc[MAX];   
int S=0;
void sort(int li, int ls){
	int i,j,mij,aux;
	i=li;
	j=ls;
	mij=x[(li+ls)/2];
	do{
		while(x[i]<mij)
			++i;
		while(x[j]>mij)
			--j;
		if (i<=j){
			aux=x[i];
			x[i]=x[j];
			x[j]=aux;
			++i;
			--j;
		}
	}while(i<=j);
	if(li<j)
		sort(li,j);
	if(i<ls)
		sort(i,ls);
}
void back(int k){
	int i,j,l;
	if(k==R+1){
		for(i=1;i<=n;++i){
			x[i]=sc[i];
			for(j=1;j<=m;++j){
				if(y[j])
					x[i]-=a[j][i];
			}
		}
		sort(1,n);
		s=S;   
		for(i=1;i<=C;++i){
			s-=x[i];
		}
		if (s>sum)
			sum=s;
	}
	else{
		for(l=v[k-1]+1;l<=m;++l){
			if (!y[l]){
				v[k]=l;
				y[l]=1;
				S-=sl[l];
				back(k+1);
				y[l]=0;
				S+=sl[l];
			}
		}
	}
}
int main(){
	int i,j;
	freopen("elimin.in","r",stdin);
	freopen("elimin.out","w",stdout);
	scanf("%d%d%d%d",&m,&n,&R,&C);
	if(m<n){
		for(i=1;i<=m;++i){
			for(j=1;j<=n;++j){
				scanf("%d",&a[i][j]);
				S+=a[i][j];
				sl[i]+=a[i][j];
				sc[j]+=a[i][j];
			}
		}
	}
	else{
		for(i=1;i<=m;++i){
			for(j=1;j<=n;++j){
				scanf("%d",&a[n-j+1][i]);
				S+=a[n-j+1][i];
				sl[n-j+1]+=a[n-j+1][i];
				sc[i]+=a[n-j+1][i];
			}
		}
		pow(m,n);
		pow(C,R);
	}
	back(1);
	printf("%d",sum);
	fclose(stdin);
	fclose(stdout);
	return 0;
}