You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.3 KiB
C++

#include <cstdio>
#include <cstring>
int n, m, a[90];
struct bigint
{
int data[80], len;
void refresh()
{
for (int i = 0; i < 30; i++)
data[i + 1] += data[i] / 10, data[i] %= 10;
for (len = 70; len >= 0 && data[len] == 0; len--)
;
if (len < 0) len = 0;
len++;
}
bigint(int val = 0)
{
memset(data, 0, sizeof(data));
data[0] = val;
refresh();
}
bigint operator+=(const bigint &rhs)
{
for (int i = 0; i < rhs.len; i++)
data[i] += rhs.data[i];
refresh();
return *this;
}
bigint operator+(const bigint &rhs)
{
bigint ret = *this;
return ret += rhs;
}
bigint operator*(const bigint &rhs)
{
bigint ret;
for (int i = 0; i < len; i++)
for (int j = 0; j < rhs.len; j++)
ret.data[i + j] += (data[i] * rhs.data[j]);
ret.refresh();
return ret;
}
};
bigint max(const bigint &a, const bigint &b)
{
if (a.len > b.len) return a;
if (a.len < b.len) return b;
for (int len = a.len; len >= 0; len--)
if (a.data[len] > b.data[len])
return a;
else if (a.data[len] < b.data[len])
return b;
return b;
}
bigint _2n[90], f[90][90], tmp, ans;
int main()
{
scanf("%d%d", &n, &m);
_2n[0] = 1;
for (int i = 1; i <= m; i++) _2n[i] = _2n[i - 1] * 2;
for (int x = 1; x <= n; x++)
{
tmp = 0;
memset(f, 0, sizeof(f));
memset(a, 0, sizeof(a));
for (int i = 1; i <= m; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= m; i++)
{
f[i][0] = f[i - 1][0] + _2n[i] * a[i];
f[0][i] = f[0][i - 1] + _2n[i] * a[m - i + 1];
}
for (int i = 1; i <= m; i++)
for (int j = 1; j <= m - i; j++)
f[i][j] = max(f[i - 1][j] + _2n[i + j] * a[i], f[i][j - 1] + _2n[i + j] * a[m - j + 1]);
for (int i = 0; i <= m; i++) tmp = max(tmp, f[i][m - i]);
ans += tmp;
}
int len = 40;
for (; len > 0 && ans.data[len] == 0; len--)
;
for (; len >= 0; len--) printf("%d", ans.data[len]);
return 0;
}