后四个点WA掉
#include <iostream>
using namespace std;
typedef unsigned long long ull;
const int maxn = 87;
const ull MOD = 1e18;
struct bint
{
ull h, l;
};
bint max(bint a, bint b)
{
if (a.l > b.l)
return a;
if (a.l < b.l)
return b;
if (a.h > b.h)
return a;
if (a.h < b.h)
return b;
return a;
}
bint operator + (bint a, bint b)
{
bint k;
k.l = k.h = 0;
k.l = a.l + b.l;
k.h = k.l / MOD + a.h + b.h;
k.l %= MOD;
return k;
}
bint operator * (bint a, int b)
{
bint k;
k.l = 0, k.h = 0;
k.l = a.l * b;
k.h = k.l / MOD + b * a.h;
k.l %= MOD;
return k;
}
int n, m;
bint ans, a[maxn], dp[maxn][maxn];
int main()
{
freopen("P1005_7.in", "r", stdin);
// ios::sync_with_stdio(false);
// cin.tie(nullptr);
// cout.tie(nullptr);
cin >> n >> m;
while (n--)
{
for (int i = 1; i <= m; ++i)
{
cin >> a[i].l;
dp[i][1] = a[i];
}
for (int l = 2; l <= m; ++l)
{
for (int i = 1; i + l - 1 <= m; ++i)
{
dp[i][l] = max(dp[i][l - 1] * 2 + a[i + l - 1], dp[i + 1][l - 1] * 2 + a[i]);
}
}
ans = ans + dp[1][m];
}
ans = ans * 2;
if (ans.h == 0ll)
cout << ans.l << "\n";
else
cout << ans.h << ans.l << "\n";
return 0;
}