Cod sursa(job #2894607)

Utilizator dfettiDaniel Fetti dfetti Data 27 aprilie 2022 23:44:09
Problema Elimin Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
using namespace std;

#define MAX_M 32
#define MAX_N 8192

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

int M, N, R, C;
int A[MAX_M][MAX_N];

int max_sum;
set<int> lines;

void check()
{
    /*cout << "lines: ";
    for (auto l : lines)
    {
        cout << l << ' ';
    }
    cout << '\n';*/

    int total_sum = 0;
    priority_queue<int, vector<int>, greater<int>> S;
    for (int j = 1; j <= N; ++j)
    {
        int current_column = 0;
        for (int i = 1; i < M; ++i)
        {
            if (lines.count(i))
                continue;

            current_column += A[i][j];
        }
        
        total_sum += current_column;
        S.push(current_column);
    }

    for (int j = 0; j < C; ++j)
    {
        total_sum -= S.top();
        S.pop();
    }
    
    max_sum = max(max_sum, total_sum);
}

void backtracking(int step)
{
    if (step == R + 1)
    {
        check();
        return;
    }

    int i = 0;
    if (lines.empty())
        i = 1;
    else
        i = *lines.rbegin() + 1;

    for (; i <= M; ++i)
    {
        lines.insert(i);
        backtracking(step + 1);
        lines.erase(i);
    }
}

int main()
{
    fin >> M >> N >> R >> C;
    for (int i = 1; i <= M; ++i)
        for (int j = 1; j <= N; ++j)
            if (M <= N)
                fin >> A[i][j];
            else
                fin >> A[j][i];

    if (M > N)
    {
        swap(M, N);
        swap(R, C);
    }

    backtracking(1);
    //cout << max_sum;
    fout << max_sum;

    return 0;
}