第一个没看题解的蓝色DP祭
40->60->70 是long long->__int 128->二次方的表打到 290的变化,然后就一直wa 后三个点
#include<bits/stdc++.h>
#define int __int128
#define gc getchar
using namespace std;
inline int rd() { int res = 0, f = 0; char ch = gc();for (; !isdigit(ch); ch = gc()) f |= (ch == '-'); for (; isdigit(ch); ch = gc()) res = (res << 1) + (res << 3) + (ch ^ '0'); return f ? -res : res;}
inline void pt(int x) {if (x < 0) putchar('-'), x = -x; if(x > 9) pt(x / 10); putchar(x % 10 + '0');}
const int N=1e6;
int n,m;
int ans,a[82][82],f[82][82][82];
int er[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312,1125899906842624,2251799813685248,4503599627370496,9007199254740992,18014398509481984,36028797018963968,72057594037927936,144115188075855872,288230376151711744,576460752303423488,1152921504606846976,2305843009213693952,4611686018427387904,9223372036854775808,18446744073709551616,36893488147419103232,73786976294838206464,147573952589676412928,295147905179352825856,590295810358705651712,1180591620717411303424,2361183241434822606848,4722366482869645213696,9444732965739290427392,18889465931478580854784,37778931862957161709568,75557863725914323419136,151115727451828646838272,302231454903657293676544,604462909807314587353088,1208925819614629174706176,2417851639229258349412352,4835703278458516698824704,9671406556917033397649408,19342813113834066795298816,38685626227668133590597632,77371252455336267181195264,154742504910672534362390528,309485009821345068724781056,618970019642690137449562112,1237940039285380274899124224};
int mx(int q,int p){return q<p?p:q;}
int dp(int x)
{
int c=0;
for(int len=m-1;len>=1;len--)
{
++c;
for(int i=1;i+len-1<=m;i++)
{
int j=i+len-1;
f[x][i][j]=mx(a[x][i-1]*er[c]+f[x][i-1][j] , f[x][i][j+1]+a[x][j+1]*er[c]);
}
}
++c;
int Max=-1;
for(int i=1;i<=m;i++) Max=mx(f[x][i][i]+a[x][i]*er[c],Max);
return Max;
}
signed main(){
n=rd(),m=rd();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++) a[i][j]=rd();
ans+=dp(i);
}
pt(ans);
}