60pts(没有高精)
#include<bits/stdc++.h>
using namespace std;
unsigned long long n,m,f[35][35][35],a[35][35],ans;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
f[i][j][j]=a[i][j]*(1<<m);
}
}
for(int k=m-1;k;k-=1){
for(int i=1;i<=k;i++){
int j=i+m-k;
for(int l=1;l<=n;l++){
f[l][i][j]=max(f[l][i+1][j]+a[l][i]*(1<<k),f[l][i][j-1]+a[l][j]*(1<<k));
}
}
}
for(int i=1;i<=n;i++){
ans+=f[i][1][m];
}
cout<<ans;
}
连样例都过不去的高精
#include<bits/stdc++.h>
using namespace std;
long long n,m;
int f[81][81][81][151],a[85][85][151],ans[151],p[151];
string s;
void add(int c[],int d[],int e[]){//e=c+d
memset(e,0,sizeof(e));
int n=max(c[0],d[0]);
for(int i=1;i<=n;i++){
e[i]+=c[i]+d[i];
e[i+1]+=e[i]/10;
e[i]%=10;
}
if(e[n+1])e[0]=n+1;
else e[0]=n;
}
void two(int c[],int y,int d[]){//d=c*(1<<y)
memset(d,0,sizeof(d));
int n=c[0];
for(int i=0;i<=n;i++)p[i]=c[i];
y--;
while(y--){
for(int i=1;i<=n;i++)d[i]=p[i]<<1;
for(int i=1;i<=n;i++)d[i+1]+=d[i]/10,d[i]%=10;
if(d[n+1])n++;
for(int i=1;i<=n;i++)p[i]=d[i];
}
d[0]=n;
}
void ma(int c[],int d[],int e[]){
memset(e,0,sizeof(e));
int lc=c[0],ld=d[0];
bool g;//0:lc 1=ld
if(lc!=ld)g=lc>ld;
else{
for(int i=lc;i;--i){
if(c[i]!=d[i]){
g=c[i]>d[i];
break;
}
}
}
if(g)for(int i=0;i<=lc;i++)e[i]=c[i];
else for(int i=0;i<=ld;i++)e[i]=d[i];
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>s;
a[i][j][0]=s.size();
for(int k=1;k<=a[i][j][0];k++)a[i][j][k]=s[a[i][j][0]-k]-'0';
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
two(a[i][j],m,f[i][j][j]);
}
}
for(int k=m-1;k;k--){
for(int i=1;i<=k;i++){
int j=i+m-k;
for(int l=1;l<=n;l++){
int q[151],qq[151],qa[151],qqa[151];
two(a[l][i],k,q);
add(q,f[l][i+1][j],qa);
two(a[l][j],k,qq);
add(f[l][i][j-1],qq,qqa);
ma(qa,qqa,f[l][i][j]);
}
}
}
for(int i=1;i<=n;i++){
int q[151];
add(ans,f[i][1][m],q);
for(int i=0;i<=q[0];i++)ans[i]=q[i];
}
for(int i=ans[0];i;i--)cout<<ans[i];
}