Pagini recente » Cod sursa (job #1682966) | Cod sursa (job #1211267) | Cod sursa (job #664006) | Cod sursa (job #888857) | Cod sursa (job #2799226)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ifstream cin("elimin.in");
ofstream cout("elimin.out");
int nl, nc, l, c;
bool swapped = false;
cin >> nl >> nc >> l >> c;
vector<vector<int>> mat;
vector<int> sc, sc_ord;
if (nl > nc) {
swapped = true;
mat = vector<vector<int>>(nc, vector<int>(nl));
sc = vector<int>(nl);
sc_ord = vector<int>(nl);
} else {
mat = vector<vector<int>>(nl, vector<int>(nc));
sc = vector<int>(nc);
sc_ord = vector<int>(nc);
}
int sum = 0;
for (int i = 0; i < nl; ++i)
for (int j = 0; j < nc; ++j) {
if (!swapped) {
cin >> mat[i][j];
sc[j] += mat[i][j];
sum += mat[i][j];
} else {
cin >> mat[j][i];
sc[i] += mat[j][i];
sum += mat[j][i];
sum += mat[j][i];
}
}
cin.close();
if (swapped) {
swap(nl, nc);
swap(l, c);
}
int p2max = (1 << nl), max_sum = 0;
for (int mask = 0; mask < p2max; ++mask) {
if (__builtin_popcount(mask) != l)
continue;
sc_ord = sc;
int new_sum = sum;
for (int i = 0; (1 << i) <= mask; ++i)
if (mask & (1 << i))
for (int j = 0; j < nc; ++j) {
new_sum -= mat[i][j];
sc_ord[j] -= mat[i][j];
}
sort(sc_ord.begin(), sc_ord.end());
for (int i = 0; i < c; ++i)
new_sum -= sc_ord[i];
max_sum = max(max_sum, new_sum);
}
cout << max_sum << "\n";
cout.close();
return 0;
}