#include<bits/stdc++.h>
using namespace std;
int a[1005][1005];
int n;
int ans;
int dfs(int csx,int csy,int x,int y,int fx,int flag/*这个点是否为起始点*/,int sz/*0是顺时针,1是逆时针*/,int wc)//1为左上,2为右上,3为右下,4为左下
{
if(x==csx && y==csy && flag)
return ans;
if((x==n && y==n) || (x==n && y==1))
{
ans+=a[x][y];
return ans;
}
if(wc)
a[x][y]=0;
else
ans+=a[x][y];
if(fx==1)
x-=1,y-=1;
if(fx==2)
y+=1,x-=1;
if(fx==3)
x+=1,y+=1;
if(fx==4)
y-=1,x+=1;
if((x==n || y==n || (x==1 && y!=1) || (y==1 && x!=1)) && flag)
{
if(!(sz))
{
fx=1+fx;
if(fx==5)
fx=1;
}
else
{
fx=fx-1;
if(fx==0)
fx=4;
}
}
dfs(csx,csy,x,y,fx,1,sz,wc);
return ans;
}
struct node {
int q;
int bh;
int fx;
int sz;
}w[1000];
bool cmp(node f,node g)
{
return f.q>g.q;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
if(n==2)
{
cout<<a[1][1]+a[1][2]+a[2][1]+a[2][2];
return 0;
}
if(n==3)
{
int s=a[1][1]+a[2][2]+a[3][3],s2=a[1][3]+a[2][2]+a[3][1],s3=a[2][1]+a[1][2]+a[2][3]+a[3][2];
if(s>s2)
{
s2-=a[2][2];
if(s2>s3)
cout<<s+s2;
else
cout<<s+s3;
}
else
{
s-=a[2][2];
if(s>s3)
cout<<s+s2;
else
cout<<s2+s3;
}
return 0;
}
for(int i=1;i<=n/2;i++)
{
ans=0;
w[i].q=dfs(1,i,1,i,3,0,0,0);
w[i].bh=i;
w[i].fx=3;
w[i].sz=0;
}
for(int i=n/2+1;i<=n;i++)
{
ans=0;
w[i].q=dfs(1,i,1,i,4,0,1,0);
w[i].bh=i;
w[i].fx=4;
w[i].sz=1;
}
sort(w+1,w+n+1,cmp);
long long sum=w[1].q;
int e=dfs(1,w[1].bh,1,w[1].bh,w[1].fx,0,w[1].sz,1);
memset(w,0,sizeof(w));
for(int i=1;i<=n/2;i++)
{
ans=0;
w[i].q=dfs(1,i,1,i,3,0,0,0);
w[i].bh=i;
w[i].fx=3;
w[i].sz=0;
}
for(int i=n/2+1;i<=n;i++)
{
ans=0;
w[i].q=dfs(1,i,1,i,4,0,1,0);
w[i].bh=i;
w[i].fx=4;
w[i].sz=1;
}
sort(w+1,w+n+1,cmp);
sum+=w[1].q;
printf("%lld",sum);
return 0;
}