Pagini recente » Cod sursa (job #2185795) | Cod sursa (job #2178605) | Cod sursa (job #929830) | Cod sursa (job #2253911) | Cod sursa (job #2894607)
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
using namespace std;
#define MAX_M 32
#define MAX_N 8192
ifstream fin("elimin.in");
ofstream fout("elimin.out");
int M, N, R, C;
int A[MAX_M][MAX_N];
int max_sum;
set<int> lines;
void check()
{
/*cout << "lines: ";
for (auto l : lines)
{
cout << l << ' ';
}
cout << '\n';*/
int total_sum = 0;
priority_queue<int, vector<int>, greater<int>> S;
for (int j = 1; j <= N; ++j)
{
int current_column = 0;
for (int i = 1; i < M; ++i)
{
if (lines.count(i))
continue;
current_column += A[i][j];
}
total_sum += current_column;
S.push(current_column);
}
for (int j = 0; j < C; ++j)
{
total_sum -= S.top();
S.pop();
}
max_sum = max(max_sum, total_sum);
}
void backtracking(int step)
{
if (step == R + 1)
{
check();
return;
}
int i = 0;
if (lines.empty())
i = 1;
else
i = *lines.rbegin() + 1;
for (; i <= M; ++i)
{
lines.insert(i);
backtracking(step + 1);
lines.erase(i);
}
}
int main()
{
fin >> M >> N >> R >> C;
for (int i = 1; i <= M; ++i)
for (int j = 1; j <= N; ++j)
if (M <= N)
fin >> A[i][j];
else
fin >> A[j][i];
if (M > N)
{
swap(M, N);
swap(R, C);
}
backtracking(1);
//cout << max_sum;
fout << max_sum;
return 0;
}