Cod sursa(job #1958994)

Utilizator antanaAntonia Boca antana Data 8 aprilie 2017 23:31:11
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>

#define MAXL 15
#define MAXN 600
#define INF 0x3f3f3f3f

using namespace std;

int v[MAXL][MAXN], st[MAXL], rows, cols, n, m, columns[MAXN], rs[MAXL];
bool taken[MAXL];
int answer = INF;

int bestSum() {
    int sum = 0, i, j;
    for(j=1; j<=m; ++j) {
        columns[j] = 0;
        for(i=1; i<=n; ++i)
            if(!taken[i])
                columns[j] += v[i][j];
    }

    sort(columns+1, columns+m+1);
    for(i=1; i<=cols; ++i)
        sum += columns[i];
    for(i=1; i<=n; ++i)
        if(taken[i])
            sum += rs[i];
    return sum;
}

void backtracking(int level) {
    if(level == rows+1) {
        answer = min(answer, bestSum());
        return;
    }

    for(int i=level; i<=n-rows+level; ++i)
        if(st[level-1] < i) {
            st[level] = i;
            taken[i] = 1;
            backtracking(level+1);
            taken[i] = 0;
        }
}

int main()
{
    freopen("elimin.in", "r", stdin);
    freopen("elimin.out", "w", stdout);

    int i, j, total = 0;

    scanf("%d%d%d%d", &n, &m, &rows, &cols);

    if(m < n) {
        swap(n, m);
        swap(rows, cols);
        for(j=1; j<=m; ++j)
            for(i=n; i>=1; --i)
                scanf("%d", &v[i][j]);
    }
    else {
        for(i=1; i<=n; ++i)
            for(j=1; j<=m; ++j)
                scanf("%d", &v[i][j]);
    }

    for(i=1; i<=n; ++i)
        for(j=1; j<=m; ++j)
            rs[i] += v[i][j], total += v[i][j];

    backtracking(1);

    printf("%d", total - answer);

    return 0;
}