Pagini recente » Cod sursa (job #2451255) | Cod sursa (job #842247) | Cod sursa (job #2617812) | Cod sursa (job #2232140) | Cod sursa (job #1864244)
#include <bits/stdc++.h>
using namespace std;
ifstream f("elimin.in");
ofstream g("elimin.out");
int n, m, r, c, cur = 0;
vector<vector<int>> mat;
vector<int> taken_lines, cols, lins;
int best_now(){
vector<int> tmp(begin(cols), end(cols));
nth_element(begin(tmp), begin(tmp) + c, end(tmp));
return accumulate(begin(tmp), begin(tmp)+c, 0); }
int rez = 1e9;
void back(){
if(taken_lines.size() == r){
rez = min(rez, best_now() + cur);
return; }
for(int i = taken_lines.back()+1; i <= n; ++i){
taken_lines.push_back(i);
for(int j = 0; j < m; ++j) cols[j] -= mat[i][j];
cur += lins[i];
back();
taken_lines.pop_back();
cur -= lins[i];
for(int j = 0; j < m; ++j) cols[j] += mat[i][j]; } }
int main(){
f >> n >> m >> r >> c;
mat.resize(n, vector<int>(m, 0));
for(auto& x : mat) for(auto& y : x) f >> y;
if(n > m){
vector<vector<int>> tmp(m, vector<int>(n, 0));
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
tmp[j][i] = mat[i][j];
mat = move(tmp);
swap(n, m); }
int sum = 0;
lins.resize(n, 0);
cols.resize(m, 0);
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j) sum += mat[i][j], cols[j] += mat[i][j], lins[i] += mat[i][j];
++r;
mat.insert(begin(mat), vector<int>{});
lins.insert(begin(lins), 0);
taken_lines.push_back(0);
back();
g << sum-rez << endl;
return 0; }