Cod sursa(job #1538627)

Utilizator preda.andreiPreda Andrei preda.andrei Data 29 noiembrie 2015 15:31:54
Problema Elimin Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <stdio.h>

using namespace std;

int mat[200][200];
int linii[101];
int col[101];

void backc(int ind, int n, int m, int l, int c, int &sum){
    if(ind>c && c!=0)
        return;

    int s;

    for(int i=col[ind-1]+1; i<=m; ++i){
        col[ind]=i;
        mat[0][0]-=mat[0][i];
        for(int z=1; z<=l; ++z)
            mat[0][0]+=mat[linii[z]][i];
        if(ind==c || c==0){
            if(mat[0][0]>sum)
                sum=mat[0][0];
        }
        else backc(ind+1, n, m, l, c, sum);
        mat[0][0]+=mat[0][i];
        for(int z=1; z<=l; ++z)
            mat[0][0]-=mat[linii[z]][i];
    }
}

void backl(int ind, int n, int m, int l, int c, int &sum){
    if(ind>l && l!=0)
        return;

    for(int i=linii[ind-1]+1; i<=n; ++i){
        linii[ind]=i;
        mat[0][0]-=mat[i][0];
        if(ind==l || l==0)
            backc(1, n, m, l, c, sum);
        else backl(ind+1, n, m, l, c, sum);
        mat[0][0]+=mat[i][0];
    }
}

int main()
{
    FILE *fin=fopen("elimin.in", "r");
    FILE *fout=fopen("elimin.out", "w");

    int n, m, l, c, sum=0;

    fscanf(fin, "%d%d%d%d", &n, &m, &l, &c);
    for(int i=1; i<=n; ++i){
        for(int j=1; j<=m; ++j){
            fscanf(fin, "%d", &mat[i][j]);
            mat[i][0]+=mat[i][j];
            mat[0][j]+=mat[i][j];
        }
        mat[0][0]+=mat[i][0];
    }

    backl(1, n, m, l, c, sum);

    fprintf(fout, "%d", sum);
    return 0;
}