Cod sursa(job #150325)

Utilizator andrei.12Andrei Parvu andrei.12 Data 6 martie 2008 20:49:53
Problema Elimin Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

int n, m, r, c, i, j, s, sm, ds[505], d[505], a[505][505], sol[25], raspuns, rs[5050], ss;
void back1(int k){
	if (k == m + 1){
		//prelucreaza();
		int nrs = 0, sm = 0, sp;
		for (int i = 1; i <= m; i ++)
			if (sol[i]){
				nrs ++;
				sm += ds[i];
			}
		
		sp = ss - sm;
		
		if (nrs == c){
			for (int i = 1; i <= n; i ++){
				rs[i] = d[i];
				
				for (int j = 1; j <= m; j ++)
					if (sol[j])
						rs[i] -= a[i][j];
			}
			
			sort(rs+1, rs+n+1);
			
			for (int i = 1; i <= r; i ++)
				sp -= d[i];
			
			if (sp > raspuns)
				raspuns = sp;
		}
		
		return ;
	}
	
	sol[k] = -1;
	while (sol[k] < 1){
		sol[k] ++;
		back1(k+1);
	}
}

void back2(int k){
	if (k == n + 1){
		//prelucreaza();
		int nrs = 0, sm = 0, sp = 0;
		for (int i = 1; i <= n; i ++)
			if (sol[i]){
				nrs ++;
				sm += d[i];
			}
		
		sp = ss - sm;
		
		if (nrs == r){
			for (int i = 1; i <= m; i ++){
				rs[i] = ds[i];
				
				for (int j = 1; j <= n; j ++)
					if (sol[j])
						rs[i] -= a[j][i];
			}
			
			sort(rs+1, rs+n+1);
			
			for (int i = 1; i <= c; i ++)
				sp -= rs[i];
			
			if (sp > raspuns)
				raspuns = sp;
		}
		
		return ;
	}
	
	sol[k] = -1;
	while (sol[k] < 1){
		sol[k] ++;
		back2(k+1);
	}
}
int main()
{
	freopen("elimin.in", "rt", stdin);
	freopen("elimin.out", "wt", stdout);
	
	
	scanf("%d%d%d%d", &n, &m, &r, &c);
	for (i = 1; i <= n; i ++){
		s = 0;
		for (j = 1; j <= m; j ++){
			scanf("%d", &a[i][j]);
			
			s += a[i][j];
			ss += a[i][j];
		}
		d[i] = s;
	}
	
	for (j = 1; j <= m; j ++){
		s = 0;
		for (i = 1; i <= n; i ++)
			s += a[i][j];
		ds[j] = s;
	}
	
	if (m < n)
		back1(1);
	else
		back2(1);
	
	printf("%d\n", raspuns);
	
	return 0;
}