Pagini recente » Cod sursa (job #2573273) | Cod sursa (job #1126235) | Cod sursa (job #2765988) | Cod sursa (job #2744491) | Cod sursa (job #711735)
Cod sursa(job #711735)
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
unsigned short h[4030][4030];
bool gen[20];
int n,m,r,c;
int v[1030];
string x;
long long maxim=-1<<30;
void back(int niv,int nr) // c coloane
{
if(niv==n+1)
{
if(nr==c)
{
// for(int i=1;i<=n;i++)
// cout<<gen[i]<<" ";
// cout<<endl;
long long S=0;
long long Sum=0;
int ind=0;
for(int i=1;i<=m;i++)
{
S=0;
for(int j=1;j<=n;j++)
if(gen[j]==0)
S+=h[i][j];
v[++ind]=S;
Sum+=S;
}
sort(v+1,v+ind+1);
for(int i=1;i<r+1;i++)
Sum-=v[i];
maxim=max(Sum,maxim);
}
return;
}
if(nr<c)
{
gen[niv]=1;
back(niv+1,nr+1);
gen[niv]=0;
}
back(niv+1,nr);
}
void back2(int niv,int nr) // r linii
{
if(niv==m+1)
{
if(nr==r)
{
// for(int i=1;i<=n;i++)
// cout<<gen[i]<<" ";
// cout<<endl;
long long S=0;
long long Sum=0;
int ind=0;
for(int i=1;i<=n;i++)
{
S=0;
for(int j=1;j<=m;j++)
if(gen[j]==0)
S+=h[j][i];
v[++ind]=S;
Sum+=S;
}
sort(v+1,v+ind+1);
for(int i=1;i<c+1;i++)
Sum-=v[i];
maxim=max(Sum,maxim);
}
return;
}
if(nr<r)
{
gen[niv]=1;
back2(niv+1,nr+1);
gen[niv]=0;
}
back2(niv+1,nr);
}
int main()
{
freopen("elimin.in","r", stdin);
freopen("elimin.out","w", stdout);
scanf("%d %d %d %d\n",&m,&n,&r,&c); // m linii si n coloane
for(int i=1;i<=m;i++)
{
getline(cin,x);
int ind=0;
for(unsigned int j=0;j<x.size();j++)
{
short nr=0;
if(isdigit(x[j]) || x[j]=='-')
{
int semn=1;
if(x[j]=='-'){
semn*=-1;
j++;}
while(isdigit(x[j]))
{
nr=nr*10+x[j]-'0';
j++;
}
h[i][++ind]=nr*semn;
}
}
}
if(n<=m) // nr coloanelor
{
back(1,0);
printf("%lld",maxim);
}
else // nr linii mai mare
{
back2(1,0);
printf("%lld",maxim);
}
return 0;
}