题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084
package DP;
//经典dp题
/*
* 状态转移方程:sum[i][j] = arr[i][j] + sum[i + 1][temp];
* arr[i][j]初始值为 输入的序列值
* sum[i][j]表示第i行第j列的值为第i行第j列的原值+第i+1行中与之相连的两个数中较大的一个和值。
* */
import java.util.*;
public class HDU2084 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t, n;
int[][] arr, sum;// arr保存数塔序列,sum保存和值
t = sc.nextInt();
while (t-- > 0) {
n = sc.nextInt();
// 初始化数组
arr = new int[n][n];
sum = new int[n][n];
// 接受输入,初始化数塔
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
arr[i][j] = sc.nextInt();
}
}
for(int i = 0;i<n;i++)
sum[n-1][i] = arr[n-1][i];
// 从下往上一次求两个相邻的数中最大的一个与上一个数相加保存在和值数组中,则最后sum[0][0]就是最后的结果
for (int i = n - 2; i >= 0; i--) {
int temp = -1;
for (int j = 0; j <= i; j++) {
if (sum[i + 1][j] > sum[i + 1][j + 1])
temp = j;
else
temp = j + 1;
//状态转移方程
sum[i][j] = arr[i][j] + sum[i + 1][temp];
//System.out.println(arr[i + 1][temp]);
}
}
System.out.println(sum[0][0]);
}
}
}