Pagini recente » Cod sursa (job #1237781) | Cod sursa (job #2498831) | Cod sursa (job #674615) | Cod sursa (job #1041633) | Cod sursa (job #271862)
Cod sursa(job #271862)
#include<stdio.h>
#include<string.h>
#define max(a,b) (a>b?a:b)
FILE *fin=fopen("elimin.in","r"),
*fout=fopen("elimin.out","w");
int A[20][600],l,c,N,M,sum[600];
int rez;
void swap(int i,int j){
sum[i]^=sum[j];sum[j]^=sum[i];sum[i]^=sum[j];
}
int calc(int conf){
memset(sum,0,sizeof(sum));
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
if( !( (1<<(i-1))&conf) )
sum[j]+=A[i][j];
for(int i=1;i<=M;i++){
int j=i;
while(j/2 && sum[j]>sum[j/2]){
swap(j,j/2);
j/=2;
}
}
int Nh=M;
while(Nh>1){
swap(1,Nh);
--Nh;
int i=1,j;
while(1){
j=i*2;
if(j>Nh) break;
if(j+1<=Nh && sum[j+1]>sum[j]) ++j;
if(sum[i]>sum[j]) break;
swap(j,i);
i=j;
}
}
int s=0;
for(int i=M;i>c;--i)
s+=sum[i];
return s;
}
int main(){
fscanf(fin,"%d %d %d %d",&N,&M,&l,&c);
if(N<M)
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
fscanf(fin,"%d",&A[i][j]);
else{
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
fscanf(fin,"%d",&A[j][i]);
N^=M;M^=N;N^=M;
l^=c;c^=l;l^=c;
}
for(int i=0;i<(1<<N);++i){
int nr=0,x=i;
while(x){
nr+=x%2;
x/=2;
}
int s=0;
if(nr==l)
s=calc(i);
rez=max(rez,s);
}
fprintf(fout,"%d\n",rez);
fclose(fin);
fclose(fout);
return 0;
}