import java.util.Scanner;
public class Main5 {
public static void main(String[] args) {
//动态规划求最大值 --递归求解
//先获取程序运行前的总毫秒数 //correntTimeMillis
long dodo = System.currentTimeMillis();
Scanner in = new Scanner(System.in);
// 定义数组
int[][] num = new int[1001][1001];
// 定义n的值
int n = in.nextInt();
// 每行有i列,且从第一列开始 从上往下查找
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
num[i][j] = in.nextInt();
// 最后一行开始
for (int i = n - 1; i >= 1; i--)
for (int j = 1; j <= i; j++)
// 求最大值
num[i][j] += num[i + 1][j] > num[i + 1][j + 1] ? num[i + 1][j] : num[i + 1][j + 1];
// 输出值
System.out.println(num[1][1]);
//再获取程序执行完毕的总毫秒数
long zhix = System.currentTimeMillis();
//输出两者之差 得到程序执行的时间
//System.out.println(later - before);
//晨旭执行前的时间*执行完毕后的=得到的时间 误差不断k次执行得到不小于10%
System.out.println("程序运行时间:"+(zhix-dodo)+"ms");
}
}
int n = 0,t=0,i=0,k=0;
Scanner cin = new Scanner(System.in);
System.out.println("请输入一个整数:");
n = cin.nextInt();
k=n;
for ( i = 0 ; i < n ;i++ ) {//塔的层数
for(int j =k-1 ; j >0 ; j --) {//打印前半部分空格
System.out.print(" ");
}
//打印数
/**
* 这是思路是利用控制层数的变量 i 控制每层前半部分该打印的数字是从多少开始,然后递减到1就停止
*/
for( t=i+1 ; t >0 ; t-- ) {
System.out.print(t);
}
//后半部分
/**
* 后面部分第一打印是从2开始,因此利用控制层数的变量i要打印多少个数字,让p 一直递增直到不满足条件
*/
for (int p = 1 ; p <i+1 ; p++) {
System.out.print(p+1);
}
for(int j = k-1 ; j >0 ; j --) {//打印后半部分空格
System.out.print(" ");
}
System.out.println();
k-=1;//控制每行的空格数
}