Cod sursa(job #2307028)

Utilizator mihaicivMihai Vlad mihaiciv Data 23 decembrie 2018 16:22:04
Problema Elimin Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stdlib.h>
#include <limits.h>
using namespace std;
int sMin;
int v[5000];
int r, c;
int colSum[5000], linSum[5000];
int n, m;
void prelucrare(int **a) {

    for (int i = 1; i <= n; ++i) {
        int pos = 1;
        if (c == 0) {
            pos = 0;
        }
        colSum[i] = 0;
        for (int j = 1; j <= m; ++j) {
            if (v[pos] == j) {
                pos ++;
            } else {
                colSum[i] += a[i][j];
            }
        }
    }
    sort(colSum + 1, colSum + n + 1);
    int currentSum = 0;
    for (int i = 1; i <= r; ++i) {
        currentSum += colSum[i];
    }
    for (int j = 1; j <= c; ++j) {
        currentSum += linSum[v[j]];
    }
    sMin = min (sMin, currentSum);
}

void BK(int k, int **a) {

    for (int i = v[k - 1] + 1; i <= m - (c - k); ++i) {
        v[k] = i;
        if (k == c || c == 0) {
            prelucrare(a);
        } else { BK(k + 1, a); }
    }

}

int main() {

    ifstream f("elimin.in");
    ofstream g("elimin.out");
    f >> n >> m >> r >> c;
    int b[n + 1][m + 1];
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            f >> b[i][j];
        }
    }
    int **a = (int**) malloc( (max(n, m) + 1) * sizeof(int*));
    for (int i = 0; i <= max(n, m); ++i) {
        a[i] = (int*) malloc((min(n, m) + 1) * sizeof(int));
    }
    // generez minim pentru coloane
    if (m > n) {
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                a[j][i] = b[i][j];
            }
        }
        swap(n, m);
        swap(r, c);
    } else {
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                a[i][j] = b[i][j];
            }
        }
    }
    for (int j = 1; j <= m; ++j) {
        for (int i = 1; i <= n; ++i) {
            linSum[j] += a[i][j];
        }
    }
    sMin = INT_MAX;
    BK(1, a);
    int totalSum = 0;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            totalSum = totalSum + a[i][j];
        }
    }
    g << totalSum - sMin;


    return 0;
}