Pagini recente » Cod sursa (job #1517439) | Cod sursa (job #148092) | Cod sursa (job #192789) | Cod sursa (job #255630) | Cod sursa (job #2079852)
#include <fstream>
#include <algorithm>
using namespace std;
int N,M,R,C,i,j,Sol[950],Lin[950],Maxi,Sum,Sum2,Lin2[950];
short int A[950][950];
void backtrackcol(int Nivel)
{
int i,j,k;
if(Nivel==C+1)
{
for(j=1;j<=M;j++)
Lin2[j]=Lin[j];
Sum2=Sum;
for(j=1;j<=M;j++)
for(k=1;k<=C;k++)
{
Lin2[j]-=A[j][Sol[k]];
Sum2-=A[j][Sol[k]];
}
sort(Lin2+1,Lin2+M+1);
for(j=1;j<=R;j++)
Sum2-=Lin2[j];
if(Sum2>Maxi)
Maxi=Sum2;
}//if
else
for(i=Sol[Nivel-1]+1;i<=N-(C-Nivel);i++)
{
Sol[Nivel]=i;
backtrackcol(Nivel+1);
}//else
}
void backtracklin(int Nivel)
{
int i,j,k;
if(Nivel==R+1)
{
for(j=1;j<=N;j++)
Lin2[j]=Lin[j];
Sum2=Sum;
for(j=1;j<=N;j++)
for(k=1;k<=R;k++)
{
Lin2[j]-=A[k][Sol[j]];
Sum2-=A[k][Sol[j]];
}
sort(Lin2+1,Lin2+M+1);
for(j=1;j<=C;j++)
Sum2-=Lin2[j];
if(Sum2>Maxi)
Maxi=Sum2;
}//if
else
for(i=Sol[Nivel-1]+1;i<=N-(R-Nivel);i++)
{
Sol[Nivel]=i;
backtracklin(Nivel+1);
}//else
}
int main()
{
ifstream fin("elimin.in");
ofstream fout("elimin.out");
fin>>M>>N>>R>>C;
for(i=1;i<=M;i++)
for(j=1;j<=N;j++)
{
fin>>A[i][j];
Lin[i]+=A[i][j];
Sum+=A[i][j];
}
if(N<M)
backtrackcol(1);
else
backtracklin(1);
fout<<Maxi;
fin.close ();
fout.close();
return 0;
}