Pagini recente » Cod sursa (job #570522) | Cod sursa (job #2161398) | Cod sursa (job #2920727) | Cod sursa (job #2718222) | Cod sursa (job #1466903)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define Nmax 7300
#define Mmax 17
#define inf 0x3f3f3f3f
FILE *f = fopen ( "elimin.in", "r" );
FILE *g = fopen ( "elimin.out", "w" );
short int v[Nmax][Mmax];
int SumLin[Nmax], SumCol[Mmax], s[Nmax], DeScazut[Nmax];
int NrBiti ( int x ){
int cnt = 0;
for ( int i = 1; i <= x; i <<= 1 )
if ( x & i )
cnt++;
return cnt;
}
int main(){
int N, M, R, C, Stot = 0, Sol = -inf;
fscanf ( f, "%d%d%d%d", &N, &M, &R, &C );
if ( N < M ){
for ( int i = 1; i <= N; ++i ){
for ( int j = 1; j <= M; ++j ){
fscanf ( f, "%hd", &v[j][i] );
SumCol[i] += v[j][i];
SumLin[j] += v[j][i];
Stot += v[j][i];
}
}
swap ( N, M );
swap ( R, C );
}
else{
for ( int i = 1; i <= N; ++i ){
for ( int j = 1; j <= M; ++j ){
fscanf ( f, "%hd", &v[i][j] );
SumCol[j] += v[i][j];
SumLin[i] += v[i][j];
Stot += v[i][j];
}
}
}
int go = ( 1 << M );
for ( int i = 0; i < go; ++i ){
int nr = NrBiti ( i );
if ( nr == C ){
int Saux = Stot;
memset ( DeScazut, 0, sizeof ( DeScazut ) );
for ( int j = 1, step = 1; j <= i; j <<= 1, ++step ){
if ( i & j ){
Saux -= SumCol[step];
for ( int k = 1; k <= N; ++k )
DeScazut[k] += v[k][step];
}
}
for ( int j = 1; j <= N; ++j )
s[j] = SumLin[j] - DeScazut[j];
sort ( s + 1, s + N + 1 );
for ( int j = 1; j <= R; ++j )
Saux -= s[j];
Sol = max ( Sol, Saux );
}
}
fprintf ( g, "%d", Sol );
return 0;
}