Pagini recente » Cod sursa (job #2889802) | Cod sursa (job #588554)
Cod sursa(job #588554)
#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;
}