Pagini recente » Cod sursa (job #1877527) | Cod sursa (job #2240139) | Cod sursa (job #2195966) | Cod sursa (job #94941) | Cod sursa (job #955749)
Cod sursa(job #955749)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("elimin.in");
ofstream fout("elimin.out");
int n, m, r, c, a[700][700];
long maxim;
vector <long> sol;
bool car[700];
void Calculare()
{
long sum = 0;
for(int j=1; j<=m; j++)
{
long s = 0;
for(int i=1; i<=n; i++)
if(!car[i]) s += a[i][j];
sol.push_back(s);
sum += s;
}
nth_element(sol.begin(), sol.begin()+c, sol.end());
for(int i=0; i<c; i++)
sum -= sol[i];
sol.clear();
if(maxim < sum) maxim = sum;
}
void Calculare2()
{
long sum = 0;
for(int i=1; i<=n; i++)
{
long s = 0;
for(int j=1; j<=m; j++)
if(!car[j]) s += a[i][j];
sol.push_back(s);
sum += s;
}
nth_element(sol.begin(), sol.begin()+r, sol.end());
for(int i=0; i<r; i++)
sum -= sol[i];
sol.clear();
if(maxim < sum) maxim = sum;
}
void Back(int k)
{
if(k == r+1) Calculare();
else
for(int j=1; j<=n; j++)
if(!car[j])
{
car[j] = 1;
Back(k+1);
car[j] = 0;
}
}
void Back2(int k)
{
if(k == c+1) Calculare();
else
for(int j=1; j<=m; j++)
if(!car[j])
{
car[j] = 1;
Back(k+1);
car[j] = 0;
}
}
int main()
{
fin>>n>>m>>r>>c;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
fin>>a[i][j];
if(r < c)Back(1);
else Back2(1);
fout<<maxim;
return 0;
}