Cod sursa(job #7127)

Utilizator tvladTataranu Vlad tvlad Data 21 ianuarie 2007 12:40:35
Problema Elimin Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasa a 9-a si gimnaziu Marime 1.15 kb
#include <cstdio>

const int NM = 1000;
const int MM = 1000;

int n, m, r, c;
int xr[NM], xc[MM];
int u[NM], v[NM];
int a[NM][MM];
int s;
int max;

void back_c ( int k ) {
	for (int j = (k == 0) ? 0 : xc[k-1]; j<n; ++j) {
		xc[k] = j;
		s -= v[j];
		for (int i = 0; i<r; ++i) s += a[xr[i]][j];
		if (s < max) {
			s += v[j];
			for (int i = 0; i<r; ++i) s -= a[xr[i]][j];
			continue;
		}
		if (k == c-1) {
			if (s > max) max = s;
		} else {
			back_c ( k+1 );
		}
		s += v[j];
		for (int i = 0; i<r; ++i) s -= a[xr[i]][j];
	}
}

void back_r ( int k ) {
	for (int i = (k == 0) ? 0 : xr[k-1]; i<n; ++i) {
		xr[k] = i;
		s -= u[i];
		if (s < max) {
			s += u[i];
			continue;
		}
		if (k == r-1) {
			back_c ( 0 );
		} else {
			back_r ( k+1 );
		}
		s += u[i];
	}
}

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

	scanf("%d %d %d %d",&n,&m,&r,&c);
	s = 0;
	for (int i = 0; i<n; ++i) {
		for (int j = 0; j<m; ++j) {
			scanf("%d",&a[i][j]);
			u[i] += a[i][j];
			v[j] += a[i][j];
			s += a[i][j];
		}
	}
	max = -2000000000;
	back_r ( 0 );
	printf("%d\n",max);
	return 0;
}