#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
char s[5];
struct shu{
int c[100],len;
shu(){
memset(c,0,sizeof(c));
len=0;
}
}dp[82][82],a[82][82],pow[82],base,ans;
shu operator*(const shu &x,const shu &y){
shu z;
for(int i=1;i<=y.len;i++){
for(int j=1;j<=x.len;j++){
z.c[i+j-1]+=x.c[j]*y.c[i];
}
}
z.len=y.len+x.len-1;
for(int i=1;i<=z.len;i++){
z.c[i+1]+=z.c[i]/10;
z.c[i]%=10;
}
if(z.c[z.len+1])z.len++;
return z;
}
shu operator+(const shu &x,const shu &y){
shu z;
z.len=max(z.len,y.len);
for(int i=1;i<=z.len;i++)
z.c[i]=y.c[i]+x.c[i];
for(int i=1;i<=z.len;i++){
z.c[i+1]+=z.c[i]/10;
z.c[i]=z.c[i]%10;
}
if(z.c[z.len+1])z.len++;
while(z.c[z.len ]==0&&z.len>1)z.len--;
return z;
}
shu Max(shu a,shu b){
if(a.len>b.len)return a;
if(a.len<b.len)return b;
for(int i=a.len;i>=1;i--){
if(a.c[i]>b.c[i])return a;
if(a.c[i]<b.c[i])return b;
}
return a;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%s",s);
int len=strlen(s);
for(int k=1;k<=len;k++)
a[i][j].c[k]=s[len-k]-'0';
a[i][j].len=len;
}
}
base.c[1]=2;base.len=1;
pow[1].c[1]=2;pow[1].len=1;
for(int i=2;i<=m;i++)pow[i]=pow[i-1]*base;
for(int i=1;i<=n;i++){
memset(dp,0,sizeof(dp));
for(int len=m;len>=1;len--){
for(int l=1;l+len-1<=m;l++){
int r=l+len-1;
dp[l][r]=Max(dp[l][r],dp[l-1][r]+a[i][l-1]*pow[m-(r-l)-1]);
dp[l][r]=Max(dp[l][r],dp[l][r+1]+a[i][r+1]*pow[m-(r-l)-1]);
}
}
shu maxx;
for(int j=1;j<=m;j++){
maxx=Max(maxx,dp[j][j]+pow[m]*a[i][j]);
}
ans=ans+maxx;
}
for(int i=ans.len;i>=1;i--)printf("%d",ans.c[i]);
return 0;
}