Cod sursa(job #2882842)

Utilizator RaresPoinaruPoinaru-Rares-Aurel RaresPoinaru Data 31 martie 2022 20:42:17
Problema Elimin Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("elimin.in");
ofstream fout ("elimin.out");

const int MAXN=8010;

int n,m,r,c;
int a[MAXN][MAXN],b[MAXN][MAXN];

int v[MAXN],rez1;
void Solven (){
    for (int i=1;i<=n;++i){
        for (int j=1;j<=m;++j){
            b[i][j]=a[i][j];
        }
    }
    for (int i=1;i<=r;++i){
        int x=v[i];
        for (int j=1;j<=m;++j){
            a[x][j]=0;
        }
    }
    int s[MAXN],stotal;
    for (int j=1;j<=m;++j){
        s[j]=0;
        for (int i=1;i<=n;++i){
            s[j]+=a[i][j];
            stotal+=a[i][j];
        }
    }
    sort (s+1,s+m+1);
    for (int i=1;i<=c;++i)
        stotal-=s[i];
    if (stotal>=rez1)
        rez1=stotal;
    for (int i=1;i<=n;++i){
        for (int j=1;j<=m;++j){
            a[i][j]=b[i][j];
        }
    }
}

void BackTrkN (int pos){
    if (pos>r){
        Solven ();
    }
    else{
        for (int i=v[pos-1]+1;i<=n;++i){
            v[pos]=i;
            BackTrkN (pos+1);
        }
    }
}

void Solvem (){
    for (int i=1;i<=n;++i){
        for (int j=1;j<=m;++j){
            b[i][j]=a[i][j];
        }
    }
    for (int i=1;i<=c;++i){
        int x=v[i];
        for (int j=1;j<=n;++j){
            a[x][j]=0;
        }
    }
    int s[MAXN],stotal;
    for (int i=1;i<=n;++i){
        s[i]=0;
        for (int j=1;j<=m;++j){
            s[i]+=a[i][j];
            stotal+=a[i][j];
        }
    }
    sort (s+1,s+n+1);
    for (int i=1;i<=r;++i)
        stotal-=s[i];
    if (stotal>=rez1)
        rez1=stotal;
    for (int i=1;i<=n;++i){
        for (int j=1;j<=m;++j){
            a[i][j]=b[i][j];
        }
    }
}

void BackTrkM (int pos){
    if (pos>c){
        Solvem ();
    }
    else{
        for (int i=v[pos-1]+1;i<=m;++i){
            v[pos]=i;
            BackTrkM (pos+1);
        }
    }
}
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 (n<=m){
        BackTrkN (1);
    }
    else{
        BackTrkM (1);
    }
    fout <<rez1;
    fin.close ();
    fout.close ();
    return 0;
}