/*
数字三角形的两种解法
*/
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n;
int g[N][N];
int mem[N][N];
int dfs(int x,int y){
if(mem[x][y]) return mem[x][y];//如果之前搜过就直接返回
//因为一个点要考虑下面两个点所有肯定会有重复记忆化可以解决
int sum=0;
//if(x>n||y>n) sum=0;
if(x>n) sum=0;
//如果一个点超过了边界就直接为0
else sum=max(dfs(x+1,y),dfs(x+1,y+1))+g[x][y];//否则它就是下面两个最大的加上自己
mem[x][y]=sum;
return sum;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
scanf("%d",&g[i][j]);
}
}
int res=dfs(1,1);
/*动态规划(—dp—)
for(int i=n-1;i>0;i--){
for(int j=1;j<=i;j++){
g[i][j]+=max(g[i+1][j],g[i+1][j+1]);
}
}
printf("%d\n",g[1][1]);
*/
cout<<mem[5][1];
return 0;
}