import java.util.Scanner;
// 洛谷 数字三角形
public class Main {
static int[][] memo;
// 记忆化搜索 O(n*m)
public static int dfs(int x, int y) {
if (x > n || y > n)
return 0;
if (memo[x][y] != 0)
return memo[x][y];
memo[x][y] = Math.max(dfs(x + 1, y), dfs(x + 1, y + 1)) + a[x][y];
return memo[x][y];
}
static int[][] a; // 数字三角形下三角
static int n;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
memo = new int[n + 1][n + 1];
a = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
a[i][j] = sc.nextInt();
}
}
System.out.println(dfs(1, 1));
// dp 逆序
int[][] f = new int[n + 2][n + 2]; // 这里注意是从n行开始 必须有n+1行 为了把f的第n行填上数字 当然也可以选择先把a中的第n行填在f中
for (int i = n; i > 0; i--) { // 从最后行开始递推 因为这样递推到最后只有一个数 也就是答案
for (int j = 1; j <= i; j++) {
f[i][j] = Math.max(f[i + 1][j], f[i + 1][j + 1]) + a[i][j];
}
}
/*
* for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) {
* System.out.print(f[i][j] + " "); } System.out.println(); }
*/
System.out.println(f[1][1]);
// dp 顺序
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
f[i][j] = Math.max(f[i - 1][j], f[i - 1][j - 1]) + a[i][j];
}
}
int max = 0;
for (int i = 1; i <= n; i++) {
max = Math.max(max, f[n][i]);
}
System.out.println(max);
// dp 空间优化
}
}