Cod sursa(job #2079852)

Utilizator Marina23Oprea Marina Marina23 Data 1 decembrie 2017 21:34:56
Problema Elimin Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#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;
}