Pagini recente » Cod sursa (job #778721) | Cod sursa (job #496205) | Cod sursa (job #529994) | Cod sursa (job #524717) | Cod sursa (job #2312285)
#include <stdio.h>
#include <algorithm>
using namespace std;
int m, n, r, c, min_dim, max_dim, min_elimin, max_elimin, s, sol_max = -1;
bool min_r;
void elimina(int lung_elimin, int *suma, int suma_cur) {
sort(suma, suma + max_dim);
for (int i = 0; i < lung_elimin; i++)
suma_cur -= suma[i];
if (suma_cur > sol_max)
sol_max = suma_cur;
}
int main() {
freopen("elimin.in", "r", stdin);
freopen("elimin.out", "w", stdout);
scanf("%d %d %d %d", &m, &n, &r, &c);
if (m <= n)
min_r = 1;
min_dim = m;
max_dim = n;
min_elimin = r;
max_elimin = c;
if (m > n) {
min_dim = n;
max_dim = m;
min_elimin = c;
max_elimin = r;
}
int a[min_dim][max_dim];
int suma_r[min_dim] = {0}, suma_c[max_dim] = {0};
if (min_r)
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
s += a[i][j];
}
else
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++) {
scanf("%d", &a[j][i]);
s += a[j][i];
}
for (int i = 0; i < min_dim; i++) {
for (int j = 0; j < max_dim; j++) {
suma_r[i] += a[i][j];
suma_c[j] += a[i][j];
}
}
if (min_r && r == 0) {
elimina(c, suma_c, s);
printf("%d", sol_max);
return 0;
}
int lim = 1 << min_dim, bin = 0, mask, nr_biti, suma_partiala;
int part_c[max_dim];
while (bin < lim) {
nr_biti = 0;
mask = 1;
while (mask <= bin) {
if (mask & bin)
nr_biti++;
mask <<= 1;
}
if (nr_biti == min_elimin) {
for (int i = 0; i < max_dim; i++)
part_c[i] = suma_c[i];
suma_partiala = s;
for (int i = 0, mask = 1; mask <= bin; i++, mask <<= 1)
if (mask & bin) {
for (int j = 0; j < max_dim; j++)
part_c[j] -= a[i][j];
suma_partiala -= suma_r[i];
}
elimina(max_elimin, part_c, suma_partiala);
}
bin++;
}
printf("%d", sol_max);
return 0;
}