#include<iostream>
#define Max 1002
using namespace std;
int num[Max][Max];
int DP[Max][Max];
int MAX(int x, int y){
return x>y?x:y;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>num[i][j];
DP[i][j]=0;
}
}
//初始化DP[1][1],即最左上角
DP[1][1]=num[1][1];
for(int i=1;i<=n;i++){
DP[i][1]=DP[i-1][1]+num[i][1];//左边界 求左边界的和
DP[1][i]=DP[1][i-1]+num[1][i];//上边界 求上边界的和
}
//通过动态数组计算,计算出到每个格子处所能获得的最大金币数。
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
DP[i][j]=MAX(DP[i-1][j],DP[i][j-1])+num[i][j];
}
}
//到达最后一个格子时, 就是整个金币列阵一次性所能拿到的最大金币数。
cout<<DP[n][n]<<endl;
return 0;
}