Cod sursa(job #1864244)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 31 ianuarie 2017 17:35:26
Problema Elimin Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("elimin.in");
ofstream g("elimin.out");

int n, m, r, c, cur = 0;
vector<vector<int>> mat;
vector<int> taken_lines, cols, lins;

int best_now(){
    vector<int> tmp(begin(cols), end(cols));
    nth_element(begin(tmp), begin(tmp) + c, end(tmp));
    return accumulate(begin(tmp), begin(tmp)+c, 0); }

int rez = 1e9;

void back(){
    if(taken_lines.size() == r){
        rez = min(rez, best_now() + cur);
        return; }
    for(int i = taken_lines.back()+1; i <= n; ++i){
        taken_lines.push_back(i);
        for(int j = 0; j < m; ++j) cols[j] -= mat[i][j];
        cur += lins[i];
        back();
        taken_lines.pop_back();
        cur -= lins[i]; 
        for(int j = 0; j < m; ++j) cols[j] += mat[i][j]; } }

int main(){
    f >> n >> m >> r >> c;
    mat.resize(n, vector<int>(m, 0));
    for(auto& x : mat) for(auto& y : x) f >> y;
    if(n > m){
        vector<vector<int>> tmp(m, vector<int>(n, 0));
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < m; ++j)
                tmp[j][i] = mat[i][j];
        mat = move(tmp);
        swap(n, m); }
    int sum = 0;
    lins.resize(n, 0);
    cols.resize(m, 0);
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < m; ++j) sum += mat[i][j], cols[j] += mat[i][j], lins[i] += mat[i][j];

    ++r;
    mat.insert(begin(mat), vector<int>{});
    lins.insert(begin(lins), 0);
    taken_lines.push_back(0);
    back();

    g << sum-rez << endl;
    return 0; }