Pagini recente » Cod sursa (job #386055) | Cod sursa (job #676654) | Cod sursa (job #1313113) | Cod sursa (job #837107) | Cod sursa (job #7127)
Cod sursa(job #7127)
#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;
}