//多线程dp 看起来就是记忆化搜索
//两条路一起来个dfs()
//dp[x1][y1][x2][y2] 记录两个点的坐标
#include<stdio.h>
#include<string.h>
#define N 50
#define max(a,b) ((a)>(b))?(a):(b);
int mat[N][N];
int dp[N][N][N][N],n;
int dir[4][4]={1,0, 1,0, 1,0, 0,1, 0,1, 1,0, 0,1, 0,1 };
void init()
{
memset(mat,-1,sizeof(mat));
memset(dp,-1,sizeof(dp));
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&mat[i][j]);
}
}
return;
}
int dfs(int x1,int y1,int x2,int y2)
{
if(mat[x1][y1]==-1||mat[x2][y2]==-1)return 0;//越界返回0
if(x1+y1==n+n) return mat[n][n];// 两条路会同时到达 mat[n][n] 只返回一个值不能x2
if(dp[x1][y1][x2][y2]!=-1)return dp[x1][y1][x2][y2];// 搜索过的状态直接返回
if(x1==x2&&y1==y2&& x1+y1>2) return 0;// 除了起始位置(1,1)两条路上的点不能再相遇
int i,a,b,c,d,temp,ans=0;
for(i=0;i<4;i++)//四种方向组合 右右 右下 下右 下下
{
a=x1+dir[i][0];
b=y1+dir[i][1];
c=x2+dir[i][2];
d=y2+dir[i][3];
temp=dfs(a,b,c,d);
ans=max(ans,temp);
}
return dp[x1][y1][x2][y2]=ans+mat[x1][y1]+mat[x2][y2];
}
int solve()
{
return dfs(1,1,1,1)-mat[1][1];
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
int ans=solve();
printf("%d\n",ans);
}
return 0;
}
//两条路一起来个dfs()
//dp[x1][y1][x2][y2] 记录两个点的坐标
#include<stdio.h>
#include<string.h>
#define N 50
#define max(a,b) ((a)>(b))?(a):(b);
int mat[N][N];
int dp[N][N][N][N],n;
int dir[4][4]={1,0, 1,0, 1,0, 0,1, 0,1, 1,0, 0,1, 0,1 };
void init()
{
memset(mat,-1,sizeof(mat));
memset(dp,-1,sizeof(dp));
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&mat[i][j]);
}
}
return;
}
int dfs(int x1,int y1,int x2,int y2)
{
if(mat[x1][y1]==-1||mat[x2][y2]==-1)return 0;//越界返回0
if(x1+y1==n+n) return mat[n][n];// 两条路会同时到达 mat[n][n] 只返回一个值不能x2
if(dp[x1][y1][x2][y2]!=-1)return dp[x1][y1][x2][y2];// 搜索过的状态直接返回
if(x1==x2&&y1==y2&& x1+y1>2) return 0;// 除了起始位置(1,1)两条路上的点不能再相遇
int i,a,b,c,d,temp,ans=0;
for(i=0;i<4;i++)//四种方向组合 右右 右下 下右 下下
{
a=x1+dir[i][0];
b=y1+dir[i][1];
c=x2+dir[i][2];
d=y2+dir[i][3];
temp=dfs(a,b,c,d);
ans=max(ans,temp);
}
return dp[x1][y1][x2][y2]=ans+mat[x1][y1]+mat[x2][y2];
}
int solve()
{
return dfs(1,1,1,1)-mat[1][1];
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
int ans=solve();
printf("%d\n",ans);
}
return 0;
}