Pagini recente » Cod sursa (job #1220850) | Cod sursa (job #2385930) | Cod sursa (job #2746625) | Istoria paginii utilizator/mihaiviteazul_voinea_geana | Cod sursa (job #1014552)
#include<vector>
#include<algorithm>
#include<fstream>
using namespace std;
int n, m, r, c, St;
int a[8000][8000];
int sumc[8000], suml[8000];
int v[8000];
int smin = 1000000000;
int greedy(bool linie) {
vector<int> h;
int i;
if (linie)
{
for (i = 1; i <= m; i++)
h.push_back(sumc[i]);
}
else {
for (i = 1; i <= n; i++)
h.push_back(suml[i]);
}
sort(h.begin(), h.end());
if (linie) {
int s = 0;
for (i = 0; i < c; i++)
s += h[i];
return s;
} else {
int s = 0;
for (i = 0; i < r; i++)
s += h[i];
return s;
}
}
void Back(int k, int nn, bool linie, int sum, int cate) {
int i;
for (v[k] = v[k - 1] + 1; v[k] <= nn; v[k]++) {
int s = 0;
if (linie)
{
s = suml[v[k]];
for (i = 1; i <= m; i++)
sumc[i] -= a[v[k]][i];
} else {
s = sumc[v[k]];
for (i = 1; i <= n; i++)
suml[i] -= a[i][v[k]];
}
if (k == cate) {
s += sum;
s += greedy(linie);
if (s < smin)
smin = s;
} else
Back(k + 1, nn, linie, sum + s, cate);
if (linie)
{
for (i = 1; i <= m; i++)
sumc[i] += a[v[k]][i];
} else {
for (i = 1; i <= n; i++)
suml[i] += a[i][v[k]];
}
}
}
int main() {
ifstream fin("elimin.in");
ofstream fout("elimin.out");
fin>>n>>m>>r>>c;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
fin>>a[i][j];
St += a[i][j];
suml[i] += a[i][j];
sumc[j] += a[i][j];
}
if (n < m)
Back(1, n, true, 0, r);
else
Back(1, m, false, 0, c);
fout<<St - smin;
}