/*
递归过程看了半天。。。
a little weak。。。
总体过程是这样的:
从上而下对其下层的正下方的元素和其正下方的右边的那个元素进行比较
返回较大(小)的
如果其下层已经是最后一层就直接返回,否则就调用其自身形成递归
数学差,真可怕!
*/
#define LOCAL
#include<iostream>
using namespace std;
#define N 100
int a[N][N];
int sum(int i, int j, int n)
{
int left, right;
if (i == n - 1)
return a[i][j];
if ((left = sum(i + 1, j, n)) > (right = sum(i + 1, j + 1, n)))
return left + a[i][j];
else
return right + a[i][j];
}
int main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int i, j, n;
while (cin >> n)
{
for (i = 0; i < n; i++)
{
for (j = 0; j <= i; j++)
cin >> a[i][j];
}
cout << sum(0, 0, n) << endl;
}
return 0;
}