Cod sursa(job #1396174)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 22 martie 2015 10:57:18
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include<algorithm>
#include <cstring>
#define DIM 600
using namespace std;

ifstream fin ("elimin.in" );
ofstream fout("elimin.out");

int N, M, i, j, K, L, C, V[DIM], W[DIM], maxim;
int A[DIM][DIM], B[DIM][DIM]; int aux, sum, T[DIM];

void Rotate(){
    for(i = 1; i <= N; i ++)
        for(j = 1; j <= M; j ++)
            B[j][N-i+1] = A[i][j];
    memcpy(A, B, sizeof(A));
    return;
}

void SetUp(){
    fin >> N >> M >> L >> C;
    for(i = 1; i <= N; i ++)
        for(j = 1; j <= M; j ++)
            fin >> A[i][j];
    if(N > M){
        Rotate();
        aux = N;
        N = M;
        M = aux;
        aux = L;
        L = C;
        C = aux;
    }
    for(j = 1; j <= M; j ++)
        for(i = 1; i <= N; i ++)
            V[j] += A[i][j];
    return;
}

void Sol(){
    int j; int i;
    for(j = 1; j <= M; j ++)
        W[j] = V[j];
    for(i = 1; i <= L; i ++){
        for(j = 1; j <= M; j ++)
            W[j] -= A[T[i]][j];
    }
    sort(W + 1, W + M + 1);
    sum = 0;
    for(j = M; j > C; j --)
        sum += W[j];
    if(sum > maxim)
        maxim = sum;
    return;
}

void Back(int l){
    if(l == L + 1)
        Sol();
    else{
        for(int i = T[l-1] + 1; i <= N; i ++){
            T[l] = i;
            Back(l + 1);
            T[l] = 0;
        }
    }
    return;
}

void Finish(){
    fout << maxim;
    return;
}

int main(){
    SetUp();
    Back(1);
    Finish();
    return 0;
}