Pagini recente » Istoria paginii utilizator/vladgtj | Cod sursa (job #3362362)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("elimin.in");
ofstream fout("elimin.out");
vector<vector<int>> mat;
int main() {
int m, n, r, c;
fin >> m >> n >> r >> c;
mat.resize(m, vector<int>(n));
for (int i = 0; i < m; i++){
for (int j = 0; j < n; j++){
fin >> mat[i][j];
}
}
long long ans = 0;
if (m < n){
for (int mask = 0; mask < (1 << m); mask++){
if (__builtin_popcount(mask) != m - r){
continue;
}
vector<long long> sumCol(n, 0);
for (int i = 0; i < m; i++){
if ((mask & (1 << i)) == 0){
continue;
}
for (int j = 0; j < n; j++){
sumCol[j] += mat[i][j];
}
}
sort(sumCol.begin(), sumCol.end(), greater<long long>());
long long sum = 0;
for (int j = 0; j < n - c; j++){
sum += sumCol[j];
}
ans = max(ans, sum);
}
} else{
for (int mask = 0; mask < (1 << n); mask++){
if (__builtin_popcount(mask) != n - c){
continue;
}
vector<long long> sumLin(m, 0);
for (int j = 0; j < n; j++){
if ((mask & (1 << j)) == 0){
continue;
}
for (int i = 0; i < m; i++){
sumLin[i] += mat[i][j];
}
}
sort(sumLin.begin(), sumLin.end(), greater<long long>());
long long sum = 0;
for (int i = 0; i < m - r; i++){
sum += sumLin[i];
}
ans = max(ans, sum);
}
}
fout << ans;
fout << '\n';
return 0;
}