Cod sursa(job #2799206)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 12 noiembrie 2021 17:21:06
Problema Elimin Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

int** mat;
bool** viz;
int* sl, * sc;
bool* used_lin, * used_col;
int nl, nc, l, c, max_sum, sum;

void schimb_lin(int a, int b) {
  for (int i = 0; i < nc; ++i)
    swap(mat[a][i], mat[b][i]);
}

void schimb_col(int a, int b) {
  for (int i = 0; i < nl; ++i)
    swap(mat[i][a], mat[i][b]);
}

void sortare() {
  for (int i = 0; i < nl - 1; ++i)
    for (int j = i + 1; j < nl; ++j)
      if (sl[i] > sl[j])
        schimb_lin(i, j);
  for (int i = 0; i < nc - 1; ++i)
    for (int j = i + 1; j < nc; ++j)
      if (sc[i] > sc[j])
        schimb_col(i, j);
}

void bk(int k) {
  if (sum <= max_sum) return;
  if (k == l + c) {
    max_sum = sum;
    return;
  }
  if (k < l) {
    for (int i = 0; i < nl; ++i)
      if (!used_lin[i]) {
        used_lin[i] = true;
        int old_sum = sum;
        vector<int> poz;
        for (int j = 0; j < nc; ++j)
          if (!viz[i][j]) {
            poz.push_back(j);
            viz[i][j] = true;
            sum -= mat[i][j];
          }
        bk(k + 1);
        for (auto j : poz)
          viz[i][j] = false;
        sum = old_sum;
        used_lin[i] = false;
      }
  } else {
    for (int j = 0; j < nc; ++j)
      if (!used_col[j]) {
        used_col[j] = true;
        int old_sum = sum;
        vector<int> poz;
        for (int i = 0; i < nl; ++i)
          if (!viz[i][j]) {
            poz.push_back(i);
            viz[i][j] = true;
            sum -= mat[i][j];
          }
        bk(k + 1);
        for (auto i : poz)
          viz[i][j] = false;
        sum = old_sum;
        used_col[j] = false;
      }
  }
}

int main() {
  ifstream cin("elimin.in");
  ofstream cout("elimin.out");
  cin >> nl >> nc >> l >> c;
  mat = new int*[nl];
  viz = new bool*[nl];
  sl = new int[nl];
  sc = new int[nc];
  used_lin = new bool[nl];
  used_col = new bool[nc];
  memset(sl, 0, nl * sizeof(int));
  memset(sc, 0, nc * sizeof(int));
  memset(used_lin, 0, nl * sizeof(bool));
  memset(used_col, 0, nc * sizeof(bool));
  for (int i = 0; i < nl; ++i) {
    mat[i] = new int[nc];
    viz[i] = new bool[nc];
    memset(viz[i], 0, nc * sizeof(bool));
  }
  for (int i = 0; i < nl; ++i)
    for (int j = 0; j < nc; ++j) {
      cin >> mat[i][j];
      sum += mat[i][j];
      sl[i] += mat[i][j];
      sc[j] += mat[i][j];
    }
  cin.close();
  sortare();
  bk(0);
  cout << max_sum << "\n";
  cout.close();
  return 0;
}