第四题:三角统计
考虑一个三角形的一系列整数,第1行1个数值,第2行2个数值,第3行3个数值,以此类推。开发一个程序统计一下从顶端到底部所有可能路径中出现的所有数字的和的最大值,规则:路径中的下一个数值位于本行下面,更确切地说,要么位于正下方,要么位于正下方的右边紧邻的位置。数字排列及可能路径如下图所示:
约束:
行数是严格的正数,但小于100。
所有数值均为正整数且在0至99之间,包含边界。
输入:
在第一行的整数n,代表测试实例的个数。 随后跟随n个测试实例。每个测试实例的起始行是一个代表行数的整数,随后跟随的是其内容。
输出:
对于每一个测试实例写出满足题意的确定值,每个值占一行。
样例输入:
2
3
1
2 1
1 2 3
4
1
1 2
4 1 2
2 3 1 1
样例输出:
5
9
程序源码:
import java.util.Scanner;
public class Demo4 {
/**
* @param args
*/
public static void main(String[] args) {
// 从标准输入读取参数
Scanner scanner = new Scanner(System.in);
// 首先读取用例数
String input = scanner.nextLine();
int count = Integer.parseInt(input.trim());
for (int i = 0; i < count; i++) {
input = scanner.nextLine();
int numbers = Integer.parseInt(input.trim());
int items[][]=new int[numbers][];
for(int j=0;j<numbers;j++){
items[j]=new int[j+1];
String str[];
input=scanner.nextLine();
str=input.split(" ");
for(int m=0;m<j+1;m++){
items[j][m]=Integer.valueOf(str[m]).intValue();
}
}
//构造当前路径的最大数
for(int f=0;f<numbers;f++){
for(int t=0;t<=f;t++){
if(t==0){
if(f==0){
items[f][t]=items[f][t];
}
else {
items[f][t]=items[f-1][t]+items[f][t];
}
}
else if(t==f){
if(f==0){
items[f][t]=items[f][t];
}
else {
items[f][t]=items[f-1][t-1]+items[f][t];
}
}
else{
if(items[f-1][t-1]>items[f-1][t]){
items[f][t]=items[f][t]+items[f-1][t-1];
}
else{
items[f][t]=items[f][t]+items[f-1][t];
}
}
}
}
int max=items[numbers-1][0];
for(int k=1;k<numbers;k++){
if(items[numbers-1][k]>max){
max=items[numbers-1][k];
}
}
System.out.println(max);
}
}
}