Cod sursa(job #1747786)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 25 august 2016 16:38:45
Problema Elimin Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

int n, m;
int r, c;
int mat[100][100];
int sumeLinie[100];
int sumeColoane[100];
vector<int> sol;
int solx[100];
int maxSuma = 0;
int sumaInitiala;

void citire()
{
    scanf("%d %d %d %d", &n, &m, &r, &c);

    if(n <= m || true == true)
    {
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < m; j++)
            {
                scanf("%d", &mat[i][j]);
                sumaInitiala += mat[i][j];
                sumeLinie[i] += mat[i][j];
            }
        }
    }
//    else
//    {
//        for(int i = 0; i < n; i++)
//        {
//            for(int j = 0; j < m; j++)
//            {
//                scanf("%d", &mat[j][i]);
//                sumaInitiala += mat[j][i];
//                sumeLinie[j] += mat[j][i];
//            }
//        }
//
//        swap(n, m);
//        swap(r, c);
//    }

}

void calculareSuma()
{
    int suma = sumaInitiala;

    if(sol.size() != r)
    {
        return;
    }

    for(int i = 0; i < 100; i++)
    {
        solx[i] = 0;
    }

    for(int i = 0; i < sol.size(); i++)
    {
        suma -=  sumeLinie[sol[i]];
        solx[sol[i]] = 1;
    }

    int tmp1;

    vector<int> tmpx;

    for(int i = 0; i < m; i++)
    {
        tmp1 = 0;

        for(int j = 0; j < n; j++)
        {
            if(solx[j] == 0)
            {
                tmp1 += mat[j][i];
            }
        }

        tmpx.push_back(tmp1);
    }

    sort(tmpx.begin(), tmpx.end());

    for(int i = 0; i < c; i++)
    {
        suma -= tmpx[i];
    }


    if(suma > maxSuma)
    {
        maxSuma = suma;
    }
}

//void backtracking()
//{
//    long long limita = ((long long)1 << (n));
//
//
//    for(long long k = 1; k < limita; k++)
//    {
//        sol.clear();
//
//        for(int i = 0; i <= 16; i++)
//        {
//            if((k & (1 << i)) != 0)
//            {
//                sol.push_back(i);
//            }
//        }
//
//        if(sol.size() != r)
//        {
//            continue;
//        }
//
//        calculareSuma();
//    }
//
//    printf("%d", maxSuma);
//}

void backtracking(int k)
{
    if(k == r)
    {
        calculareSuma();
    }
    else
    {
        int start;

        if(k == 0)
        {
            start = 0;
        }
        else
        {
            start = sol[k - 1];
        }

        for(int i = start; i < n; i++)
        {
            sol.push_back(i);
            backtracking(k + 1);
            sol.pop_back();
        }
    }
}

int main()
{
    freopen("elimin.in", "r", stdin);
    freopen("elimin.out", "w", stdout);

    citire();
    backtracking(0);
    printf("%d", maxSuma);

    return 0;
}