Pagini recente » Cod sursa (job #2614461) | Cod sursa (job #1805035) | Cod sursa (job #2876863) | Cod sursa (job #1327506) | Cod sursa (job #1751522)
#include <iostream>
#include <cstdio>
#include <bitset>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,r,c,sum_tot,maxim;
int mat[90][3700];
int linii_alese[90];
bitset<100> viz;
void pune_bitset()
{
for(int i = 1 ; i <= r ; ++i)
{
viz[linii_alese[i]] = true;
}
}
void reset()
{
for(int i = 1 ; i <= n ; ++i)
{
viz[i] = false;
}
}
void linii(int &tmp_sum)
{
int tmp;
for(int i = 1 ; i <= r ; ++i)
{
tmp = 0;
for(int j = 1 ; j <= m ; ++j)
{
tmp += mat[linii_alese[i]][j];
}
tmp_sum -= tmp;
}
}
void coloane(int tmp_sum)
{
int sum_col[3700];
memset(sum_col,0,sizeof(sum_col));
for(int i = 1 ; i <= n ; ++i)
{
if(viz[i])
{
continue;
}
for(int j = 1 ; j <= m ; ++j)
{
sum_col[j] += mat[i][j];
}
}
sort(sum_col + 1, sum_col + m + 1);
for(int i = 1 ; i <= c ; ++i)
{
tmp_sum -= sum_col[i];
}
if(tmp_sum > maxim)
{
maxim = tmp_sum;
}
}
void alegere()
{
int tmp_sum = sum_tot;
for(int i = 1 ; i <= r ; ++i)
{
linii_alese[i] = i;
}
pune_bitset();
linii(tmp_sum);
coloane(tmp_sum);
bool crescubil = true;
while(crescubil)
{
reset();
tmp_sum = sum_tot;
crescubil = false;
for(int i = r ; i > 0 ; --i)
{
if(linii_alese[i] < n - (r - i))
{
crescubil = true;
linii_alese[i]++;
for(int j = i + 1 ; j <= r ; ++j)
{
linii_alese[j] = linii_alese[i] + (j - i);
}
pune_bitset();
linii(tmp_sum);
coloane(tmp_sum);
break;
}
}
}
}
void citire()
{
scanf("%d %d %d %d\n",&n,&m,&r,&c);
bool invers = false;
if(n > m)
{
invers = true;
}
for(int i = 1 ; i <= n ; ++i)
{
for(int j = 1 ; j <= m ; ++j)
{
if(invers)
{
scanf("%d ", &mat[j][i]);
sum_tot += mat[j][i];
}
else
{
scanf("%d ", &mat[i][j]);
sum_tot += mat[i][j];
}
}
}
if(invers)
{
int aux = n;
n = m;
m = aux;
}
alegere();
}
int main()
{
freopen("elimin.in","r",stdin);
freopen("elimin.out","w",stdout);
citire();
printf("%d",maxim);
return 0;
}