Cod sursa(job #1538623)

Utilizator preda.andreiPreda Andrei preda.andrei Data 29 noiembrie 2015 15:25:51
Problema Elimin Scor 30
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];

int suma(int l, int c){
    int s=mat[0][0];

    for(int i=1; i<=l; ++i){
        s-=mat[linii[i]][0];
        for(int j=1; j<=c; ++j)
            s+=mat[linii[i]][col[j]];
    }

    for(int i=1; i<=c; ++i)
        s-=mat[0][col[i]];
    return s;
}

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;
        if(ind==c || c==0){
            s=suma(l, c);
            if(s>sum)
                sum=s;
        }
        else backc(ind+1, n, m, l, c, sum);
    }

}

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;
        if(ind==l || l==0)
            backc(1, n, m, l, c, sum);
        else backl(ind+1, n, m, l, c, sum);
    }
}

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;
}