Pagini recente » Cod sursa (job #3288461) | Cod sursa (job #1428075) | Cod sursa (job #24971) | Cod sursa (job #3293807) | Cod sursa (job #504492)
Cod sursa(job #504492)
#include <stdio.h>
#include <algorithm>
#define IN "elimin.in"
#define OUT "elimin.out"
using namespace std;
const int L = 1000;
int R, C, N, M;
int Mat[L][L];
int mat[L][L];
int col[L], Col[L], Lin[L];
int Rez;
int S;
void Read()
{
scanf ("%d %d %d %d", &N, &M, &R, &C);
for (int i = 0 ; i < N ; i++)
for (int j = 0 ; j < M ; j++)
{
scanf ("%d", &Mat[i][j]);
S += Mat[i][j];
Lin[i] += Mat[i][j];
Col[j] += Mat[i][j];
}
}
void Flip()
{
for (int i = 0 ; i < M ; i++)
for (int j = 0 ; j < N ;j++)
mat[i][j] = Mat[j][i];
N^=M^=N^=M;
for (int i = 0 ; i < N ; i++)
for (int j = 0 ; j < M ;j++)
Mat[i][j] = mat[j][i];
}
void Check(int P)
{
int S1 = S;
for (int i = 0 ; i < M ; i++)
col[i] = Col[i];
for (int j = 0 ; j < N ;j++)
{
if ((P>>j)&1)
{
S1 -= Lin[j];
for (int i = 0 ; i < M ; i++)
col[i] -= Mat[j][i];
}
}
sort(col, col + M);
for (int i = 0 ; i < C ; i++)
S1 -= col[i];
if (S1 > Rez)
Rez = S1;
}
void Solve()
{
int nr = 0;
for (int i = 0 ; i<(1<<N) ;i++)
{
nr = 0;
for (int j = 0 ; j < N ;j++)
nr += (i>>j)&1;
if (nr == R)
Check(i);
}
printf("%d\n", Rez);
}
int main()
{
freopen (IN, "r", stdin);
freopen (OUT, "w", stdout);
Read();
if (M < N)
Flip();
Solve();
return 0;
}