Cod sursa(job #1513828)

Utilizator preda.andreiPreda Andrei preda.andrei Data 30 octombrie 2015 00:05:53
Problema Elimin Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <stdio.h>

using namespace std;

int v[8001];
int sumal[8001];
int sumac[8001];
int linii[8001];

int n, m, r, c;

void backtracking(int ind, int poz, int rr, int cc, int scur, int &sf){
    if(poz>n || poz>m)
        return;

    if(rr<=r || r==0){
        if(r==0){
            r=-1;
            backtracking(1, 1, rr, 1, scur, sf);
            return;
        }
        for(int i=poz; i<=n; ++i){
            linii[ind]=i;
            if(rr>=r)
                backtracking(1, 1, rr+1, 1, scur-sumal[i], sf);
            else backtracking(ind+1, i+1, rr+1, cc, scur-sumal[i], sf);
        }
    }
    else{
        if(c==0){
            if(scur>sf)
                sf=scur;
            return;
        }

        int aux;
        for(int i=poz; i<=m; ++i){
            aux=0;
            for(int j=1; j<=r; ++j)
                aux=aux+v[(linii[j]-1)*m+i];
            scur=scur-sumac[i]+aux;
            if(cc>=c){
                if(scur>sf){
                    sf=scur;
                }
            }
            else if(cc<c)
                backtracking(ind+1, i+1, rr, cc+1, scur, sf);
            scur=scur+sumac[i]-aux;
        }
    }
}

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

    int sf=0, tot=0;

    fscanf(fin, "%d%d%d%d", &n, &m, &r, &c);
    for(int i=1; i<=n; ++i){
        for(int j=1; j<=m; ++j){
            fscanf(fin, "%d", &v[(i-1)*m+j]);
            sumal[i]+=v[(i-1)*m+j];
            sumac[j]+=v[(i-1)*m+j];
            tot+=v[(i-1)*m+j];
        }
    }

    if(r==0 && c==0)
        sf=tot;
    else backtracking(1, 1, 1, 0, tot, sf);

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