Pagini recente » Cod sursa (job #849397) | Cod sursa (job #1817062) | Cod sursa (job #566699) | Cod sursa (job #367883) | Cod sursa (job #7438)
Cod sursa(job #7438)
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int N, M, n1, m1;
int a[20][8000];
long long sumlin[20];
long long sumcol[8000];
long long sumca[8000];
int vec[20];
int nrb(int x)
{
int nr = 0;
while (x) {
nr++;
x &= x-1;
}
return nr;
}
int gen(int N, int M, int n1, int m1)
{
freopen("elimin.in", "w", stdout);
printf("%d %d %d %d\n", N, M, n1, m1);
int i, j;
for (i = 1; i <= N; i++) {
for (j = 1; j <= M; j++) printf("%d ", rand() % 32000);
printf("\n");
}
fclose(stdout);
return 0;
}
int main()
{
// gen(521, 14, 123, 7);
int i, j, k, aux, q;
freopen("elimin.in", "r", stdin);
freopen("elimin.out", "w", stdout);
scanf("%d %d %d %d", &N, &M, &n1, &m1);
long long tot = 0;
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
{
scanf("%d", &q);
tot += q;
if (N <= M) a[i][j] = q, sumlin[i] += q, sumcol[j] += q;
else a[j][i] = q, sumlin[j] += q, sumcol[i] += q;
}
if (N > M) {
aux = N; N = M; M = aux;
aux = n1; n1 = m1; m1 = aux;
}
long long cur, sc, rez = 0;
for (i = 0; i < (1 << N); i++)
{
if (nrb(i) != n1) continue;
cur = tot;
vec[0] = 0;
for (j = 1, k = 0; j <= i; j <<= 1, k++)
if (j & i) {
vec[++vec[0]] = k;
cur -= sumlin[k];
}
for (j = 0; j < M; j++) {
sc = sumcol[j];
for (k = 1; k <= vec[0]; k++)
sc -= a[vec[k]][j];
sumca[j] = sc;
}
sort(sumca, sumca + M);
for (j = 0; j < m1; j++) cur -= sumca[j];
if (cur > rez) rez = cur;
}
printf("%lld\n", rez);
fclose(stdin);
fclose(stdout);
return 0;
}