Pagini recente » Istoria paginii runda/ceau_oni2017_2 | Cod sursa (job #2914555) | Cod sursa (job #123396) | Cod sursa (job #2661775) | Cod sursa (job #2307028)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stdlib.h>
#include <limits.h>
using namespace std;
int sMin;
int v[5000];
int r, c;
int colSum[5000], linSum[5000];
int n, m;
void prelucrare(int **a) {
for (int i = 1; i <= n; ++i) {
int pos = 1;
if (c == 0) {
pos = 0;
}
colSum[i] = 0;
for (int j = 1; j <= m; ++j) {
if (v[pos] == j) {
pos ++;
} else {
colSum[i] += a[i][j];
}
}
}
sort(colSum + 1, colSum + n + 1);
int currentSum = 0;
for (int i = 1; i <= r; ++i) {
currentSum += colSum[i];
}
for (int j = 1; j <= c; ++j) {
currentSum += linSum[v[j]];
}
sMin = min (sMin, currentSum);
}
void BK(int k, int **a) {
for (int i = v[k - 1] + 1; i <= m - (c - k); ++i) {
v[k] = i;
if (k == c || c == 0) {
prelucrare(a);
} else { BK(k + 1, a); }
}
}
int main() {
ifstream f("elimin.in");
ofstream g("elimin.out");
f >> n >> m >> r >> c;
int b[n + 1][m + 1];
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
f >> b[i][j];
}
}
int **a = (int**) malloc( (max(n, m) + 1) * sizeof(int*));
for (int i = 0; i <= max(n, m); ++i) {
a[i] = (int*) malloc((min(n, m) + 1) * sizeof(int));
}
// generez minim pentru coloane
if (m > n) {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
a[j][i] = b[i][j];
}
}
swap(n, m);
swap(r, c);
} else {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
a[i][j] = b[i][j];
}
}
}
for (int j = 1; j <= m; ++j) {
for (int i = 1; i <= n; ++i) {
linSum[j] += a[i][j];
}
}
sMin = INT_MAX;
BK(1, a);
int totalSum = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
totalSum = totalSum + a[i][j];
}
}
g << totalSum - sMin;
return 0;
}