//第一次遇到这种DP,看大牛的博客都是用最大流求解的。。。dp[k][i][j] 表示走k步,第一条路线横向走了i步,第二条路线横向走了j步,所获得的最大值。。
//转移方程也很好想
#include<stdio.h>
#include<string.h>#define Max(x,y) (x>y?x:y)
int dp[60+2][30+2][30+2],map[30+2][30+2],n;
int max(int a,int b,int c,int d){
return Max(a,Max(Max(b,c),d));
}
int main(){
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&map[i][j]);
}
}
memset(dp,0,sizeof(dp));
for(int k=1;k<2*n-2;k++){
for(int i=0;i<=k&&i<n;i++){
for(int j=0;j<=k&&j<n;j++){
if(i==j){
continue;
}
int& res=dp[k][i][j];
res=max(dp[k-1][i][j],dp[k-1][i-1][j],dp[k-1][i][j-1],dp[k-1][i-1][j-1]);
res+=map[i][k-i]+map[j][k-j];
}
}
}
int ans=Max(dp[2*n-3][n-1][n-2],dp[2*n-3][n-2][n-1]);
ans+=map[0][0]+map[n-1][n-1];
printf("%d\n",ans);
}
}