30pts qwq
#include<bits/stdc++.h>
using namespace std;
int f[81][81][101],ans[101],n,m,a[81][81][101],c[101];
void out(int a[]){
for(int i=a[0];i>0;i--) cout<<a[i];
cout<<endl;
}
void out1(int a[]){
for(int i=a[0]+3;i>=0;i--) cout<<a[i];
cout<<"..."<<endl;
}
void fz(int a[],int b[]){
for(int i=0;i<=100;i++) a[i]=b[i];
}
void add(int a[],int b[]){
if(a[0]==0){
fz(a,b);
return;
}
for(int i=1;i<b[0];i++){
a[i]+=b[i];
if(a[i]>9) a[i+1]++,a[i]-=10;
}
a[b[0]]+=b[b[0]];
if(a[b[0]]>9) a[b[0]+1]++,a[0]=max(a[0],b[0]+1),a[b[0]]-=10;
else a[0]=max(a[0],b[0]);
}
void sm(int a[],int b[]){
fz(c,a);
if(c[0]==0){
fz(c,b);
return;
}
for(int i=1;i<b[0];i++){
c[i]+=b[i];
if(c[i]>9) c[i+1]++,c[i]-=10;
}
c[b[0]]+=b[b[0]];
if(c[b[0]]>9) c[b[0]+1]++,c[0]=max(c[0],b[0]+1),c[b[0]]-=10;
else c[0]=max(c[0],b[0]);
}
void tw(int a[]){
int t[101];
fz(t,a);
add(a,t);
}
bool mx(int a[],int b[]){
if(a[0]>b[0]) return 1;
else if(a[0]<b[0]) return 0;
for(int i=a[0];i>0;--i)
if(a[i]>b[i]) return 1;
else if(a[i]<b[i]) return 0;
return 0;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
int x,b[101];
memset(b,0,sizeof(b));
cin>>x;
while(x>0){
b[++b[0]]=x%10;
x/=10;
}
for(int k=1;k<=b[0];k++) a[i][j][k]=b[k];
a[i][j][0]=b[0];
memset(b,0,sizeof(b));
}
for(int i=1;i<=n;i++){
memset(f,0,sizeof(f));
for(int j=0;j<m;j++)
for(int k=1;k+j<=m;k++){
int x[101],y[101];
memset(x,0,sizeof(x)),memset(y,0,sizeof(y));
sm(f[k+1][k+j],a[i][k]),fz(x,c);
sm(f[k][k+j-1],a[i][k+j]),fz(y,c);
if(mx(x,y)) tw(x),fz(f[k][k+j],x);
else tw(y),fz(f[k][k+j],y);
}
add(ans,f[1][m]);
}
if(ans[0]==0){
cout<<0;
return 0;
}
for(int i=ans[0];i>0;i--) cout<<ans[i];
return 0;
}
马蜂清奇,大佬轻喷(((