import java.util.Scanner;
public class 数字三角形递归计算 {
static Scanner cin = new Scanner(System.in);
static int A[][] = new int[1 << 7][1 << 7];
static int dp[][] = new int[1 << 7][1 << 7];
static int n = 0;
public static void main(String[] args) {
while (cin.hasNext()) {
n = cin.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
A[i][j] = cin.nextInt();
}
}
for (int j = 1; j <= n; j++) { // 边界
dp[n][j] = A[n][j];
}
for (int i = n - 1; i >= 1; i--) { // n-1
for (int j = 1; j <= i; j++) {
dp[i][j] = A[i][j]
+ Math.max(dp[i + 1][j], dp[i + 1][j + 1]);
}
}
System.out.println(dp[1][1]);
}
}
}
-------------
package com.supermars.practice;
import java.util.Arrays;
import java.util.Scanner;
public class 数字三角形记忆化 {
static Scanner cin = new Scanner(System.in);
static int A[][] = new int[1 << 7][1 << 7];
static int dp[][] = new int[1 << 7][1 << 7];
static int n = 0;
public static void main(String[] args) {
while (cin.hasNext()) {
n = cin.nextInt();// 层
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
A[i][j] = cin.nextInt();
dp[i][j] = -1;
}
}
System.out.println(d(1, 1));
print_paht(1, 1);
}
}
/**
* DAG
*
* @param i
* @param j
*/
private static void print_paht(int i, int j) {
String p = "(" + (i) + "," + (j) + ") ";
while (i != n) {
int tmp = dp[i][j] - A[i][j];
if (tmp == dp[i + 1][j]) {
p += "(" + (i + 1) + "," + (j) + ") ";
i = i + 1;
}
if (tmp == dp[i + 1][j + 1]) {
p += "(" + (i + 1) + "," + (j + 1) + ") ";
i = i + 1;
j = j + 1;
}
}
System.out.println(p);
}
private static int d(int i, int j) {
if (dp[i][j] >= 0)
return dp[i][j];
return dp[i][j] = A[i][j]
+ (i == n ? 0 : (Math.max(d(i + 1, j), d(i + 1, j + 1))));
}
}