Cod sursa(job #504508)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 27 noiembrie 2010 21:51:16
Problema Elimin Scor 100
Compilator cpp Status done
Runda antrenament_2 Marime 1.17 kb
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define Nmx 5000

using namespace std;

int m,n,a[Nmx][Nmx];
int l,c,smax,viz[Nmx],st[Nmx];
int sum[Nmx];

void citire()
{
    scanf("%d%d%d%d",&n,&m,&l,&c);
    if(n<=m)
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j)
                scanf("%d",&a[i][j]);
    else
    {
        l^=c^=l^=c;
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j)
                scanf("%d",&a[j][i]);
        n^=m^=n^=m;
    }
}

void solve()
{
    memset(sum,0,Nmx);
    for(int j=1;j<=m;++j)
        for(int i=1;i<=n;++i)
            if(viz[i]==0)
                sum[j]+=a[i][j];
    sort(sum+1,sum+m+1);
    int st=0;
    for(int i=m;i>c;--i)
        st+=sum[i];
    if(st>smax)
        smax=st;
}

void back(int k)
{
    if(k==l+1)
       solve();
    else for(int i=st[k-1]+1;i<=n;i++)
	 {
	     st[k]=i;
         viz[i]=1;
         back(k+1);
         viz[i]=0;
     }
}


int main()
{
    freopen("elimin.in","r",stdin);
    freopen("elimin.out","w",stdout);
    citire();
    if(l==0)
        solve();
    else back(1);
    printf("%d\n",smax);
    return 0;
}