#include <bits/stdc++.h>
using namespace std;
int main()
{
// 数据行数,也就是列数
int r;
cin >> r;
// 根据输入的行数创建对应大小的数组
int x[r][r];
// 将数组所有数据初始化为0
memset(x, 0, sizeof(x));
// 读入数据
for(int i=0;i<r;i++)
{
// 根据数据结构,第0行1个数据,第1行2个数据,第2行3个数据...
// 因此每行数据量和行号i的关系应该是:数据量=i+1
for(int j=0;j<i+1;j++)
{
cin >> x[i][j];
}
}
// 逆向递推,从倒数第二行开始,把下方一行同一条路上来的较大数累加上来
for(int i=r-2;i>=0;i--)
{
// 遍历当前行的每个数据,数据量同样=i+1
for(int j=0;j<i+1;j++)
{
// 当前元素 = 当前元素 + 下方一行中需要从本元素经过的所有元素中最大的元素
// 一轮循环完保证本行所有元素均已最大化加成,也即从下方上来的线路到本处已是值最大。
x[i][j] += x[i+1][j] > x[i+1][j+1] ? x[i+1][j] : x[i+1][j+1];
}
}
cout << x[0][0];
return 0;
}