Pagini recente » Cod sursa (job #1760719) | Cod sursa (job #1749011)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n, m;
int r, c;
int mat[90][3700];
int sumeLinie[90];
int sumeColoane[90];
int sol[90];
int solx[90];
int maxSuma = 0;
int sumaInitiala;
void citire()
{
scanf("%d %d %d %d", &n, &m, &r, &c);
if(n <= m)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
scanf("%d", &mat[i][j]);
sumaInitiala += mat[i][j];
sumeLinie[i] += mat[i][j];
}
}
}
else
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
scanf("%d", &mat[j][i]);
sumaInitiala += mat[j][i];
sumeLinie[j] += mat[j][i];
}
}
swap(n, m);
swap(r, c);
}
sol[0] = -1;
}
void calculareSuma()
{
int suma = sumaInitiala;
for(int i = 1; i <= r; i++)
{
suma -= sumeLinie[sol[i]];
solx[sol[i]] = 1;
}
int tmp1;
vector<int> tmpx;
for(int i = 0; i < m; i++)
{
tmp1 = 0;
for(int j = 0; j < n; j++)
{
if(solx[j] == 0)
{
tmp1 += mat[j][i];
}
}
tmpx.push_back(tmp1);
}
sort(tmpx.begin(), tmpx.end());
for(int i = 0; i < c; i++)
{
suma -= tmpx[i];
}
if(suma > maxSuma)
{
maxSuma = suma;
}
for(int i = 1; i <= r; i++)
{
solx[sol[i]] = 0;
}
}
//void backtracking()
//{
// long long limita = ((long long)1 << (n));
//
//
// for(long long k = 1; k < limita; k++)
// {
// sol.clear();
//
// for(int i = 0; i <= 16; i++)
// {
// if((k & (1 << i)) != 0)
// {
// sol.push_back(i);
// }
// }
//
// if(sol.size() != r)
// {
// continue;
// }
//
// calculareSuma();
// }
//
// printf("%d", maxSuma);
//}
void backtracking(int k)
{
if(k == r + 1)
{
calculareSuma();
}
else
{
int start;
start = sol[k - 1] + 1;
for(int i = start; i < n - (r - k); i++)
{
sol[k] = i;
backtracking(k + 1);
}
}
}
int main()
{
freopen("elimin.in", "r", stdin);
freopen("elimin.out", "w", stdout);
citire();
backtracking(1);
printf("%d", maxSuma);
return 0;
}