Pagini recente » Cod sursa (job #2149447) | Cod sursa (job #713289) | Cod sursa (job #481187) | Cod sursa (job #946593) | Cod sursa (job #8300)
Cod sursa(job #8300)
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
#define inf 1000000000 //un miliard
int n, m, r, c, best = inf, a[16][2048], sum[2048], sum2[2048], st[16];
void readdata()
{
freopen("elimin.in", "r", stdin);
freopen("elimin.out", "w", stdout);
int i, j, val;
scanf("%d %d %d %d", &n, &m, &r, &c);
for (i = 0; i < n; ++i)
for (j = 0; j < m; ++j)
{
scanf("%d", &val);
if (n <= m) a[i][j] = val;
else a[j][i] = val;
}
if (n > m) swap(n, m), swap(r, c);
}
void eval()
{
int i, j, rez = 0;
memcpy(sum2, sum, sizeof(sum));
for (i = 1; i <= r; ++i)
for (j = 0; j < m; ++j)
{
sum2[j] -= a[st[i]][j];
rez += a[st[i]][j];
}
sort(sum2, sum2+m);
for (i = 0; i < c; ++i)
rez += sum2[i];
best = min(rez, best);
}
void back(int k)
{
if (k > r)
{
eval();
return;
}
for (int i = st[k-1] + 1; i < n-(r-k); ++i)
{
st[k] = i;
back(k+1);
}
}
void solve()
{
int i, j, s = 0;
for (j = 0; j < m; ++j)
for (i = 0; i < n; ++i)
{
sum[j] += a[i][j];
s += a[i][j];
}
st[0] = -1;
back(1);
printf("%d\n", s-best);
}
int main()
{
readdata();
solve();
return 0;
}