Cod sursa(job #290190)

Utilizator flamecataCiobanu Alexandru-Catalin flamecata Data 27 martie 2009 16:44:10
Problema Elimin Scor 100
Compilator cpp Status done
Runda aa Marime 2.41 kb
#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;     
}