#define rep(i,n) for(int i=0;i<(int)(n);i++) #define ALL(v) v.begin(),v.end() typedef long long ll; #include using namespace std; int A[110][110]; int H[110],W[110],RD[220],LD[220]; vector HH(110),WW(110),RDD(220),LDD(220); int main(){ ios::sync_with_stdio(false); std::cin.tie(nullptr); int h,w; cin>>h>>w; for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++) cin>>A[i][j]; } for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ H[i]+=A[i][j]; W[j]+=A[i][j]; RD[i-j+w-1]+=A[i][j]; LD[i+j-2]+=A[i][j]; HH[i]+=A[i][j]; WW[j]+=A[i][j]; RDD[i-j+w-1]+=A[i][j]; LDD[i+j-2]+=A[i][j]; } } sort(ALL(HH)),sort(ALL(WW)),sort(ALL(RDD)),sort(ALL(LDD)); reverse(ALL(HH)),reverse(ALL(WW)),reverse(ALL(RDD)),reverse(ALL(LDD)); int ans=0; if(h>1) ans=max(ans,HH[0]+HH[1]); else ans=max(ans,HH[0]); if(w>1) ans=max(ans,WW[0]+WW[1]); else ans=max(ans,WW[0]); if(h+w>2) ans=max(ans,RDD[0]+RDD[1]); else ans=max(ans,RDD[0]); if(h+w>2) ans=max(ans,LDD[0]+LDD[1]); else ans=max(ans,LDD[0]); for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ ans=max(ans,H[i]+W[j]-A[i][j]); } } for(int j=1;j<=w;j++){ for(int k=0;k<=h+w-2;k++){ int ni=j-w+1+k; if(1<=ni && ni<=h) ans=max(ans,W[j]+RD[k]-A[ni][j]); else ans=max(ans,W[j]+RD[k]); } for(int k=0;k<=h+w-2;k++){ int ni=-j+2+k; if(1<=ni && ni<=h) ans=max(ans,W[j]+LD[k]-A[ni][j]); else ans=max(ans,W[j]+LD[k]); } } for(int i=1;i<=h;i++){ for(int k=0;k<=h+w-2;k++){ int nj=i+w-1-k; if(1<=nj && nj<=w) ans=max(ans,H[i]+RD[k]-A[i][nj]); else ans=max(ans,H[i]+RD[k]); } for(int k=0;k<=h+w-2;k++){ int nj=i+w-1-k; if(1<=nj && nj<=w) ans=max(ans,H[i]+LD[k]-A[i][nj]); else ans=max(ans,H[i]+LD[k]); } } for(int k=0;k<=h+w-2;k++){ for(int l=0;l<=h+w-2;l++){ int dh=k+l-w+3,dw=w+1+l-k; if(dh%2==0 && dw%2==0 && 1<=dh/2 && dh/2<=h && dw/2>=1 && dw/2<=w){ ans=max(ans,RD[k]+LD[l]-A[dh/2][dw/2]); } else ans=max(ans,RD[k]+LD[l]); } } for(int i=1;i<=h;i++) ans=max(ans,H[i]); for(int j=1;j<=w;j++) ans=max(ans,W[j]); for(int k=0;k<=h+w-2;k++){ ans=max(ans,RD[k]); ans=max(ans,LD[k]); } cout<