Pagini recente » Cod sursa (job #2720267) | Cod sursa (job #523062) | Cod sursa (job #1220375) | Cod sursa (job #1450837) | Cod sursa (job #462973)
Cod sursa(job #462973)
using namespace std;
#include<cstdio>
int n,m,r,c,i,j,nr,a[100][100],sol[100];
long max;
void sumal()
{
long s[100],aux,sum=0;
for(i=1;i<=n;i++)
{
s[i]=0;
for(j=1;j<=m;j++)
if(!sol[j]) s[i]=s[i]+a[j][i];
j=i;
while(j>=2 && s[j]>s[j-1])
{
aux=s[j];
s[j]=s[j-1];
s[j-1]=aux;
j--;
}
}
for(i=1;i<=n-c;i++)
sum=sum+s[i];
if(sum>max) max=sum;
}
void sumac()
{
long s[100],aux,sum=0;
for(i=1;i<=m;i++)
{
s[i]=0;
for(j=1;j<=n;j++)
if(!sol[j]) s[i]=s[i]+a[i][j];
j=i;
while(j>=2 && s[j]>s[j-1])
{
aux=s[j];
s[j]=s[j-1];
s[j-1]=aux;
j--;
}
}
for(i=1;i<=m-r;i++)
sum=sum+s[i];
if(sum>max) max=sum;
}
void backl(int k)
{
if(k==m+1) sumal();
else
{
if(nr<r)
{
sol[k]=1;
nr++;
backl(k+1);
nr--;
}
if(m-k>=r-nr)
{
sol[k]=0;
backl(k+1);
}
}
}
void backc(int k)
{
if(k==n+1) sumac();
else
{
if(nr<c)
{
sol[k]=1;
nr++;
backc(k+1);
nr--;
}
if(n-k>=c-nr)
{
sol[k]=0;
backc(k+1);
}
}
}
int main()
{
freopen("elimin.in","r",stdin);
freopen("elimin.out","w",stdout);
scanf("%d%d%d%d",&m,&n,&r,&c);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
if(n<m) backc(1);
else backl(1);
printf("%li\n",max);
return 0;
}