Cod sursa(job #8864)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 25 ianuarie 2007 20:54:16
Problema Elimin Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <stdio.h>
#include <string.h>

#define NMAX 1000
#define MMAX NMAX

int i,j,n,m,A[NMAX][MMAX],c,l,st[NMAX],ll[NMAX],cc[MMAX],S[MMAX],V[MMAX],SUMA_MAX;

int apare(int x, int y)
{
 long i,gasit=0;
 for (i=1;i<=y-1;i++)
    if (st[i] == x)
      {
       gasit=1;
       break;
      }
 return gasit;
}

void Quick(int li, int ls)
{
 int i=li,j=ls,x=S[(li+ls)/2],y;

 while (i<=j)
      {
       while (S[i] < x) i++;
       while (S[j] > x) j--;
       
       if (i<=j)
         {
          y=S[i]; S[i]=S[j]; S[j]=y;
          y=V[i]; V[i]=V[j]; V[j]=y;
          i++; j--;
         }
      }
      
 if (li<j) Quick(li,j);
 if (i<ls) Quick(i,ls);
}

void Solve1(void)
{
 int i,j;

 memcpy(ll,st,sizeof(st));

 int sum=0;
 for (i=1;i<=n;i++)
 for (j=1;j<=m;j++)
    if (!ll[i] && !cc[j])
      sum+=A[i][j];

 if (sum > SUMA_MAX)
   SUMA_MAX=sum;
}

void Solve2(void)
{
 int i,j;

 memcpy(cc,st,sizeof(st));

 int sum=0;
 for (i=1;i<=n;i++)
 for (j=1;j<=m;j++)
    if (!ll[i] && !cc[j])
      sum+=A[i][j];

 if (sum > SUMA_MAX)
   SUMA_MAX=sum;
}

void Back(int k, int idu)
{
 int i;

 if (k == n+1)
   {
    int kk=0;
    for (i=1;i<=n;i++)
       if (st[i] == 1)
         kk++;

/*    for (i=1;i<=n;i++)
       printf("%d ",st[i]);
    printf("\n"); */
         
    if (kk == l && idu==0)
      Solve1();
      else
    if (kk == c && idu==1)
      Solve2();
   }
   else if (k<n+1)
          for (i=0;i<=1;i++)
             {
              st[k]=i;
              Back(k+1,idu);
             }
}

int main()
{
 freopen("elimin.in","r",stdin);
 freopen("elimin.out","w",stdout);

 scanf("%d%d%d%d",&n,&m,&l,&c);
 for (i=1;i<=n;i++)
 for (j=1;j<=m;j++)
    scanf("%d",&A[i][j]);
 SUMA_MAX=0;

 memset(cc, 0 , sizeof(cc));

 for (j=1;j<=m;j++)
    {
     int sum=0;
     for (i=1;i<=n;i++)
        sum+=A[i][j];
     S[j]=sum;
     V[j]=j;
    }
/* for (i=1;i<=m;i++)
    printf("%d ",S[i]);
 printf("\n"); */


 Quick(1,m);
 
 for (i=1;i<=c;i++)
    cc[V[i]]=1;

 Back(1,0);

 memset(ll, 0 , sizeof(ll));
 memset(cc, 0 , sizeof(cc));

 for (i=1;i<=n;i++)
    {
     int sum=0;
     for (j=1;j<=m;j++)
        sum+=A[i][j];
     S[i]=sum;
     V[i]=i;
    }
    
/* for (i=1;i<=m;i++)
    printf("%d ",S[i]);
 printf("\n"); */


 Quick(1,n);
 
 for (i=1;i<=l;i++)
    ll[V[i]]=1;

 Back(1,1);

 printf("%d",SUMA_MAX);

 fclose(stdin);
 fclose(stdout);
 
 return 0;
}