//birocratie2 #4611
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
string fisier="birocratie";
ifstream fin(fisier+".in");
ofstream fout(fisier+".out");
#define MINIM -1e9
#define Nmax 1001
int n, mat[Nmax][Nmax];
int dp[Nmax][Nmax];
/*
programare dinamica pe diagonale;
//
parcurgem pe rand toate diagonalele paralele cu cea secundara,
de sus in jos iar apoi de jos in sus; parcurgea in ambele directii
este pentru a verifica ca toate costurile sunt calculate optim,
fara sa conteze ordinea in care procesam elemente;
in cazul fiecarui element, vedem daca putem ajunge la el
prin una dintre celelalte 2 variante posibile de deplasare
(in jos sau la dreapta);
daca exista, alegem calea de castig maxim si o adunam elementului
curent;
*/
void citire()
{
fin>>n;
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
fin>>mat[i][j];
}
bool sunt_in_matrice(int i, int j)
{
return i>=1 && i<=n && j>=1 && j<=n;
}
void rezolvare()
{
dp[1][1]=mat[1][1];
for(int diag=2; diag<=2*n-1; ++diag)
{
int suma=MINIM;
for(int i=1; i<=n; ++i)
{
int j=diag-i+1;
if(sunt_in_matrice(i,j))
{
if(sunt_in_matrice(i-1,j))
{
suma=max(suma,dp[i-1][j]);
}
if(sunt_in_matrice(i,j-1))
{
suma=max(suma,dp[i][j-1]);
}
dp[i][j]=suma+mat[i][j];
suma+=mat[i][j];
}
}
suma=MINIM;
for(int i=n; i>=1; --i)
{
int j=diag-i+1;
if(sunt_in_matrice(i,j))
{
if(sunt_in_matrice(i-1,j))
{
suma=max(suma,dp[i-1][j]);
}
if(sunt_in_matrice(i,j-1))
{
suma=max(suma,dp[i][j-1]);
}
dp[i][j]=max(dp[i][j],suma+mat[i][j]);
//vedem daca obtinem o imbunatatire fata
//de prima parcurgere
suma+=mat[i][j];
}
}
}
fout<<dp[n][n];
}
int main()
{
citire();
rezolvare();
return 0;
}