Cod sursa(job #21052)

Utilizator tvladTataranu Vlad tvlad Data 22 februarie 2007 20:58:09
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define dbg if(v1)
bool v1 = false;

const int N = 3647;

int n,m,r,c, sg;
int a[N][N];
int sc[N], sl[N], x[N];
int max_my = -2000000000;
struct s_linie {
	int s, p;
};
s_linie y[N];

inline bool comp_s_linie ( const s_linie &a, const s_linie &b ) { return (a.s > b.s); }

void linii() {
	int s = sg;
	for (int i = 0; i<n; ++i) {
		y[i].p = i;
		y[i].s = -sl[i];
		for (int j = 0; j<c; ++j) {
			y[i].s += a[i][x[j]];
		}
		dbg printf("Linia %d scade %d\n",i,y[i].s);
	}
	sort(y,y+n,comp_s_linie);
	for (int i = 0; i<r; ++i) {
		s += y[i].s;
		dbg printf("Aleg linia %d\n",y[i].p);
	}
	if (s > max_my) max_my = s;
}

void back ( int lvl ) {
	for (int i = (lvl == 0) ? 0 : x[lvl-1]+1; i<n; ++i) {
		x[lvl] = i;
		sg -= sc[x[lvl]];
		if (lvl == c-1) {
			dbg printf("O varianta pe coloane: ");
			dbg for (int i = 0; i<=lvl; ++i) {
				printf("%d ",x[i]);
			}
			dbg printf("\n");
			linii();
		} else {
			back(lvl+1);
		}
		sg += sc[x[lvl]];
	}
}

int main() {
	freopen("elimin.in","r",stdin);
	freopen("elimin.out","w",stdout);

	scanf("%d %d %d %d",&n,&m,&r,&c);
	if (n < m) {
		//citesc inversat
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j<m; ++j) {
				scanf("%d",&a[j][i]);
				sg += a[j][i];
				sc[i] += a[j][i];
				sl[j] += a[j][i];
			}
		}
		n ^= m; m ^= n; n ^= m;
		r ^= c; c ^= r; r ^= c;
	} else {
		//citesc normal
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j<m; ++j) {
				scanf("%d",&a[i][j]);
				sg += a[i][j];
				sc[j] += a[i][j];
				sl[i] += a[i][j];
			}
		}
	}
	dbg printf("Intru in back\n");
	back(0);

	printf("%d\n",max_my);
	return 0;
}