#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,tot,cnt,maxx1,maxx2,maxx;
int a[1005][1005],vis[1005][1005];
int dx=1,dy=1;
struct node
{
int start,cnt;
}dis[1005];
void dfs(int x,int y)
{
if(x==n) dx=-dx;
if(y==1||y==n) dy=-dy;
x+=dx,y+=dy;
if(vis[x][y]==0) cnt+=a[x][y];
if(x==1) return ;
dfs(x,y);
}
void dfs1(int x,int y)
{
if(x==n) dx=-dx;
if(y==1||y==n) dy=-dy;
x+=dx,y+=dy;
vis[x][y]=1;
if(x==1) return ;
dfs1(x,y);
}
bool cmp(node x,node y)
{
if(x.cnt==y.cnt) return x.start<y.start;
return x.cnt>y.cnt;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=n;i++)
{
cnt=0,dx=1,dy=1;
if(i==1)
{
for(int j=1;j<=n;j++)
{
cnt+=a[j][j];
}
}
else if(i==n)
{
for(int j=1;j<=n;j++)
{
cnt+=a[j][n-j+1];
}
}
else dfs(1,i);
++tot;
dis[tot].cnt=cnt;
dis[tot].start=i;
}
sort(dis+1,dis+tot+1,cmp);
maxx1=dis[1].cnt;
for(int t=1;t<=tot;t++)
{
dx=1,dy=1;
memset(vis,0,sizeof vis);
if(dis[t].cnt==maxx1)
{
dfs1(1,dis[t].start);
for(int i=1;i<=n;i++)
{
cnt=0,dx=1,dy=1;
if(i==1)
{
for(int j=1;j<=n;j++)
{
if(!vis[j][j])cnt+=a[j][j];
}
}
else if(i==n)
{
for(int j=1;j<=n;j++)
{
if(!vis[j][n-j+1])cnt+=a[j][n-j+1];
}
}
else dfs(1,i);
maxx2=max(maxx2,cnt);
}
}
maxx=max(maxx,maxx1+maxx2);
}
cout<<maxx<<endl;
return 0;
}