Pagini recente » Cod sursa (job #2845424) | Cod sursa (job #2829805) | Cod sursa (job #2946084) | Istoria paginii runda/de_placere/clasament | Cod sursa (job #983477)
Cod sursa(job #983477)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
vector< vector<short> > mat;
vector< vector<short> > temp;
vector<bool> elim_ln;
vector<int> sumcol;
short m,n,R,C,result,result_max=0;
int sum_clmn(short sz)
{
int s=0;
for(short i=0;i<m;i++)
s+=mat[i][sz];
return s;
}
int sum()
{
long s=0;
for(short i=0;i<m;i++)
for(short j=0;j<n;j++)
s+=mat[i][j];
return s;
}
void elimin(short sz)
{
for(short i=0;i<n;i++)
mat[sz][i]=0;
elim_ln[sz]=true;
}
void backt_ln(short k)
{
if(k>R)
{
result=sum();
for(short j=0;j<n;j++)
sumcol[j]=sum_clmn(j);
sort(sumcol.begin(), sumcol.end());
for(short j=0;j<C;j++)
result-=sumcol[j];
if(result>result_max)
result_max=result;
}
else
for(short i=0;i<m;i++)
if(elim_ln[i]!=true)
{
for(short j=0;j<n;j++)
temp[i][j]=mat[i][j];
elimin(i);
backt_ln(k+1);
for(short j=0;j<n;j++)
mat[i][j]=temp[i][j];
elim_ln[i]=false;
}
}
int main()
{
ifstream fin("elimin.in");
ofstream fout("elimin.out");
fin>>m>>n>>R>>C;
mat.resize(m);
for(short i=0;i<m;i++)
mat[i].resize(n);
for(short i=0;i<m;i++)
for(short j=0;j<n;j++)
fin>>mat[i][j];
elim_ln.resize(m);
temp.resize(m);
for(short i=0;i<m;i++)
temp[i].resize(n);
sumcol.resize(n);
backt_ln(1);
cout<<result_max;
fout<<result_max;
return 0;
}