Pagini recente » Cod sursa (job #707084) | Cod sursa (job #1017367)
#include <vector>
#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("elimin.in");
ofstream fout("elimin.out");
int n, m, r, c, sumt,**a;
int *sumc, *suml,*v;
int smin = 1<<30 ;
int greedy(bool lin) {
vector<int> h;
int i;
if (lin)
{
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());
int s=0;
if (lin)
{
for (i = 0; i < c; i++)
s += h[i];
return s;
}
else
{
for (i = 0; i < r; i++)
s += h[i];
return s;
}
}
void back(int k, int nn, bool lin, int sum, int count) {
int i;
for (v[k] = v[k - 1] + 1; v[k] <= nn; v[k]++)
{
int s = 0;
if (lin)
{
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 == count)
{
s += sum;
s += greedy(lin);
if (s < smin)
smin = s;
}
else
back(k + 1, nn, lin, sum + s, count);
if (lin)
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() {
fin>>n>>m>>r>>c;
// cerr<<n<<' '<<m<<' '<<r<<' '<<c<<'\n';
a = new int*[n+1];
suml = new int[n+1];
sumc = new int[m+1];
for (int i = 1; i <= n; i++)
{
a[i] = new int[m+1];
for (int j = 1; j <= m; j++)
{
fin>>a[i][j];
sumt += a[i][j];
suml[i] += a[i][j];
sumc[j] += a[i][j];
// cerr<<a[i][j]<<' ';
}
// cerr<<'\n';
}
if (n < m)
{
v = new int[n+1];
v[0] = 0;
back(1, n, true, 0, r);
}
else
{
v = new int[m+1];
v[0] = 0;
back(1, m, false, 0, c);
}
fout<<sumt - smin;
}