Pagini recente » Cod sursa (job #1657290) | Cod sursa (job #888567) | Cod sursa (job #2475638) | Cod sursa (job #3188091) | Cod sursa (job #290190)
Cod sursa(job #290190)
#include <stdio.h>
#define FIN "elimin.in"
#define FOUT "elimin.out"
#define N_MAX 8000
#define swap(a,b) a^=b^=a^=b
#define N_MIN 20
int N,M,R,C;
int a[N_MIN][N_MAX];
int X[N_MAX];
int Y[N_MIN];
int s1[N_MIN];
int sl[N_MIN],sc[N_MAX];
int SUMA=0,s,S=0;
void quicksort(int li, int ls)
{
int i,j,mij,aux;
i=li;
j=ls;
mij=X[li+(ls-li)/2];
do
{
while (X[i]<mij) ++i;
while (X[j]>mij) --j;
if (i<=j)
{
aux = X[i];
X[i] = X[j];
X[j] = aux;
++i;
--j;
}
}
while (i<=j);
if (li<j) quicksort(li,j);
if (i<ls) quicksort(i,ls);
}
void back(int k)
{
int i,j;
if (k == R+1)
{
for (i=1;i<=N;++i)
{
X[i] = sc[i];
for (j = 1;j <= M;++j)
if (Y[j])
X[i]-=a[j][i];
}
quicksort(1,N);
//sort(X+1,X+N+1);
s = S;
for(i=1;i<=C;++i)
s-=X[i];
if (s>SUMA)
SUMA=s;
}
else
{
for (int l = s1[k-1]+1; l <= M; ++l)
if (!Y[l])
{
s1[k] = l;
Y[l] = 1;
S -= sl[l];
back(k+1);
Y[l] = 0;
S += sl[l];
}
}
}
void read()
{
int i,j;
freopen(FIN,"rt",stdin);
freopen(FOUT,"wt",stdout);
scanf("%d %d %d %d", &M, &N, &R, &C);
if (M<N)
{
for (i=1;i<=M;++i)
for (j=1;j<=N;++j)
{
scanf("%d ", &a[i][j]);
S += a[i][j];
sl[i] += a[i][j];
sc[j] += a[i][j];
}
}
else
{
for (i=1;i<=M;++i)
for (j=1;j<=N;++j)
{
scanf("%d ", &a[N-j+1][i]);
S+=a[N-j+1][i];
sl[N-j+1]+=a[N-j+1][i];
sc[i]+=a[N-j+1][i];
}
swap(M,N);
swap(C,R);
}
}
int main()
{
read();
back(1);
printf("%d", SUMA);
return 0;
}