Pagini recente » Cod sursa (job #2158336) | Cod sursa (job #2733192) | Cod sursa (job #1050387) | Cod sursa (job #609370) | Cod sursa (job #2799206)
#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;
}