Pagini recente » Cod sursa (job #2007871) | Cod sursa (job #1979044) | Cod sursa (job #2596960) | Monitorul de evaluare | Cod sursa (job #8345)
Cod sursa(job #8345)
#include <stdio.h>
#include <algorithm>
#include <vector>
#define NMAX 20
#define MMAX 8000
using namespace std;
int A[NMAX][MMAX], Sc[MMAX], N, M;
int C[NMAX][MMAX];
int Sum, Max, v[NMAX], R, L;
vector<pair<int, int> > S;
void linie()
{
int i, j, s, n, p = (1<<N), k, ss;
for (i = 1; i < p; i++)
{
for (j = 0; j < M; j++)
{
Sc[j] = 0;
for (k = 0; k < N; k++) C[k][j] = A[k][j], Sc[j] += A[k][j];
}
n = 0;
for (j = 0; j < N; j++)
v[n] = j*((i>>j)&1), n += (i>>j)&1;
if (n == L)
{
for (k = 0; k < M; k++)
{
for (j = 0; j < n; j++) C[ v[j] ][k] = 0, Sc[k] -= A[ v[j] ][k];
S.push_back(make_pair(Sc[j], j));
}
sort(S.begin(), S.end());
for (j = 0; j < N; j++)
for (k = 0; k < R; k++) C[j][ S[k].second ] = 0;
s = 0;
for (j = 0; j < N; j++)
for (k = 0; k < M; k++) s += C[j][k];
if (s > Max) Max = s;
S.clear();
}
}
}
int main()
{
int i, j;
freopen("elimin.in", "r", stdin);
scanf("%d %d %d %d", &N, &M, &R, &L);
if (N<=M)
{
for (i = 0; i < N; i++)
for (j = 0; j < M; j++) scanf("%d", &A[i][j]), Sum += A[i][j];
linie();
}
else
{
for (i = 0; i < N; i++)
for (j = 0; j < M; j++) scanf("%d", &A[j][i]), Sum += A[j][i];
i = N; N = M; M = i;
linie();
}
freopen("elimin.out", "w", stdout);
printf("%d\n", Max);
return 0;
}