//利用aMaxSum來標記該位置坐標上的值是否被計算過了,如果被計算了直接利用原來已經存在aMaxSum中的值
//遞歸是一個比較難以理解的知識,最好的方法是自己通過畫出遞歸調用圖來理解中間的過程
//動態規劃是以遞歸為基礎的,需要解決的是將遞歸中出現的重復子問題記錄下來,以減少下次遞歸時的重復計算從而減少時間復雜度;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[101][101];
int n;
int aMaxSum[101][101]; 

int max_sum (int r,int j)

{
if ( r == n - 1)
return a[r][j];
if (aMaxSum[r + 1][j] == -1)
aMaxSum[r + 1][j] = max_sum (r + 1, j);
if (aMaxSum[r + 1][j + 1] == -1)
aMaxSum[r + 1][j + 1] = max_sum (r + 1, j + 1);
if ( aMaxSum[r + 1][j] > aMaxSum[r + 1][j + 1])
return aMaxSum[r + 1][j] + a[r][j];
else
return aMaxSum[r + 1][j + 1] + a[r][j];
}
int main ()

{
while ( scanf ("%d", &n) != EOF )
{
for (int i = 0; i < n; i ++)
{
for (int j = 0; j < i+ 1; j ++ )
{
scanf ("%d", &a[i][j]);
}
}
memset (aMaxSum, -1, sizeof (aMaxSum));
int max = max_sum (0,0);
printf ("%d\n", max);
}
return 0;
}



