Cod sursa(job #1566489)

Utilizator ASTELOTudor Enescu ASTELO Data 12 ianuarie 2016 09:59:03
Problema Elimin Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int v[10001],vc[10001],i,j,n,m,k,l,c,st[101],maxi=0,vec[10001];
short int a[601][601];
void back(int k)
    {
    int cc;
    if(k==l+1)
        {
        int c1,c2;
        for(c1=1;c1<=m;c1++)
            vec[c1]=vc[c1];
        for(c1=1;c1<=l;c1++)
            for(c2=1;c2<=m;c2++)
                vec[c2]-=a[st[c1]][c2];
        sort(vec+1,vec+m+1);
        int s=0;
        for(c2=c+1;c2<=m;c2++)
            s+=vec[c2];
        if(s>maxi)
            maxi=s;
        }
    else
        {
        for(cc=st[k-1]+1;cc<=n;cc++)
            {
            st[k]=cc;
            back(k+1);
            }
        }
    }
void back1(int k)
    {
    int cc;
    if(k==c+1)
        {
        int c1,c2;
        for(c1=1;c1<=n;c1++)
            vec[c1]=v[c1];
        for(c2=1;c2<=c;c2++)
            for(c1=1;c1<=n;c1++)
                vec[c1]-=a[c1][st[c2]];
        sort(vec+1,vec+n+1);
        int s=0;
        for(c2=l+1;c2<=n;c2++)
            s+=vec[c2];
        if(s>maxi)
            maxi=s;
        }
    else
        {
        for(cc=st[k-1]+1;cc<=m;cc++)
            {
            st[k]=cc;
            back1(k+1);
            }
        }
    }
int main ()
{
freopen("elimin.in","r",stdin);
freopen("elimin.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&l,&c);
st[0]=0;
for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
        scanf("%hd",&a[i][j]);
for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
        {
        v[i]+=a[i][j];
        vc[j]+=a[i][j];
        }
if(l<=c)
    {
    back(1);
    printf("%d",maxi);
    }
else
    {
    back1(1);
    printf("%d",maxi);
    }
return 0;
}