Cod sursa(job #2104566)

Utilizator mariaBmaria blaj mariaB Data 11 ianuarie 2018 20:29:58
Problema Elimin Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;
int v[8000],s[8000],ans=0,n,m,r,c;
vector <int> mat[8000], matc[8000];
void solve(){
    int i,j;
    for(i=1;i<=m;i++){
        s[i]=0;
        for(j=1;j<=n;++j){
            if(v[j]==0)
               s[i]+=mat[j][i];
        }
    }
    sort(s+1, s+m+1);
    int sum = 0;
    for(i = c+1; i<=m; ++i)
        sum += s[i];
    ans = max(ans, sum);
}
void backt(int cnt,int x){
    if(x==n+1){
        if(cnt==r){
           solve();
        }
        return;
    }
    if(cnt > r)
        return;
    v[x] = 1;
    backt(cnt+1, x+1);
    v[x] = 0;
    backt(cnt, x+1);
}

void rotateMat()
{
    int i,j;

    for(j=1; j<=m; j++)
        matc[j].resize(n+1);

    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            matc[m+1-j][i] = mat[i][j];

    for(j=1; j<=m; j++)
        mat[j].resize(n+1);
    for(j=m+1; j<=n; j++)
        mat[j].clear();

    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            mat[i][j] = matc[i][j];

    swap(n,m);
}

int main()
{
    int i,j;
    ifstream cin("elimin.in");
    ofstream cout("elimin.out");
    cin >> n >> m >> r >> c;
    for(i = 1; i<=n; i++)
    {
        mat[i].resize(m+1);
        for(j = 1; j<=m; j++)
            cin >> mat[i][j];
    }
    if(n > m)
        rotateMat();
    backt(0,1);
    cout << ans << "\n";
    return 0;
}