Pagini recente » Cod sursa (job #2769967) | Cod sursa (job #2592048) | Cod sursa (job #1296698) | Cod sursa (job #312816) | Cod sursa (job #2306352)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("elimin.in");
ofstream g("elimin.out");
int Stack[91], sum, suma[7295], suma2[7295], A[7295], maxSum, N, M, R, C;
void check () {
sum = 0;
for (int cnt = 0; cnt < M; ++cnt) {
suma2[cnt] = suma[cnt];
sum += suma[cnt];
}
for (int cnt = 0; cnt < R; ++cnt) {
int poz = Stack[cnt] * M;
for (int j = 0; j < M; ++j) {
suma2[j] -= A[poz];
sum -= A[poz];
++poz;
}
}
sort (suma2, suma2 + M);
for (int cnt = 0; cnt < C; ++cnt)
sum -= suma2[cnt];
if (sum > maxSum)
maxSum = sum;
}
void backt (int level) {
if (level == R) {
check();
return;
}
for (int i = Stack[level - 1] + 1; i <= N - (R - level); ++i) {
Stack[level] = i;
backt(level + 1);
}
}
int main()
{
f >> N >> M >> R >> C;
if (N > M) {
swap(N, M);
swap(R, C);
for (int i = 0; i < M; ++i)
for (int j = 0; j < N; ++j) {
f >> A[ (N - j - 1) * M + i];
suma[N - j - 1] += A[ (N - j - 1) * M + i];
}
}
else {
int k = 0;
for (int i = 0; i < N; ++i)
for (int j = 0; j < M; ++j) {
f >> A[k];
suma[j] += A[k];
++k;
}
}
if (R == 0) {
maxSum = 0;
sort(suma, suma + M);
for (int i = C; i < M; ++i)
maxSum += suma[i];
g << maxSum;
return 0;
}
for (int x = 0; x <= N - R; ++x) {
Stack[0] = x;
backt(1);
}
g << maxSum;
return 0;
}