Cod sursa(job #588554)

Utilizator cipriancxFMI - gr143 Timofte Ciprian cipriancx Data 8 mai 2011 16:40:47
Problema Elimin Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#include <stdlib.h>

int m,n,r,c,suma,max;
int a[1000][1000],coloane[1000],linii[1000];
int v[2000];


void elimcol(int k)
{
int i;
for(i=1; i<=m; i++){ linii[i]-=a[i][k]; }
suma-=coloane[k];

}

void refcol(int k)
{
    int i;
    for(i=1; i<=m; i++){linii[i]+=a[i][k]; }

    suma+=coloane[k];

}



void afisare()
{


int i,j;

for(i=1; i<=c; i++) elimcol(v[i]);
for(j=c+1; j<=r+c; j++)suma-=linii[v[j]];
if(suma>max){max=suma;}

for(j=c+1; j<=r+c; j++)suma+=linii[v[j]];
for(i=1; i<=c; i++) refcol(v[i]);


}


int valid(int k)
{
int kk=v[k];

if(k<=c)
{


int i;

for(i=1; i<k; i++)if(v[i]>=kk)return 0;
    return 1;

}
else {int i;
     for(i=c+1; i<k; i++)if(v[i]>=kk)return 0;
        return 1;
     }



}

void back(int k)
{
    if(k<=c)
    {
        int i;
        for(i=1; i<=n; i++){ v[k]=i; if(valid(k))back(k+1);                       }
    }

     if(c<k && k<=r+c)
     {
       int i;
       for(i=1; i<=m; i++){ v[k]=i; if(valid(k))back(k+1);       }
     }

else afisare();
}






















int main()
{
    freopen("elimin.in","r",stdin);
    freopen("elimin.out","w",stdout);
    scanf("%d %d %d %d",&m,&n,&r,&c);

int i,j;

for(i=1; i<=m; i++)
{
    for(j=1; j<=n; j++){scanf("%d",&a[i][j]); suma+=a[i][j]; coloane[j]+=a[i][j]; linii[i]+=a[i][j]; }

}

max=0;
back(1);
printf("%d ",max);

    return 0;
}