Pagini recente » Cod sursa (job #556604) | Cod sursa (job #2596712) | Cod sursa (job #2647036) | Cod sursa (job #188120) | Cod sursa (job #1077990)
#include <fstream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("elimin.in");
ofstream g("elimin.out");
int n, m, r, c, ans;
short int A[530][530], B[530][530];
bool elimin[20];
vector <int> Sume;
void read() {
f >> n >> m >> r >> c;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
f >> A[i][j];
}
void rotate() {
int crt_line = 0, crt_column;
for (int j = 1; j <= m; j++) {
++crt_line;
crt_column = 0;
for (int i = n; i >= 1; i--)
B[crt_line][++crt_column] = A[i][j];
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
A[i][j] = B[i][j];
}
void solve() {
if (n < m)
rotate();
for (int conf = 0; conf < (1 << m); conf++) {
int countBits = 0;
int rez = 0;
memset (elimin, 0, sizeof(elimin));
Sume.clear();
for (int x = 0; x < m; x++)
if (conf & (1 << x)) {
elimin[x + 1] = 1;
countBits++;
}
if (countBits != c)
continue;
for (int i = 1; i <= n; i++) {
int sum = 0;
for (int j = 1; j <= m; j++)
if (!elimin[j])
sum += (int)A[i][j];
Sume.push_back (sum);
}
sort (Sume.begin(), Sume.end());
for (int i = Sume.size() - 1, cnt = 1; cnt <= n - r; cnt++, i--)
rez += Sume[i];
ans = max (ans, rez);
}
}
int main() {
read();
solve();
g << ans << '\n';
return 0;
}