【题目描述】
观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。
在上面的样例中,从13到8到26到15到24的路径产生了最大的和86。【输入】
第一个行包含R(1≤ R≤1000),表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100。【输出】
单独的一行,包含那个可能得到的最大的和。
【输入样例】
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11【输出样例】
86
思路
用二维数组存储数据,从下往上循环下面两个结点的最大值加到上面那个结点即可
a[i][j] 加上 a[i+1][j] 和 a[i+1][j+1]其中大一点的那个
(ps:最开始思路是从上往下的…这样不光在循环的时候要考虑数字是三角形边上还是里面(边上不需要考虑最大值直接加上即可),循环完之后还要再循环一次找到最大值…相当麻烦……)
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[][] num = new int[1001][1001];
int[][] sum = new int[1001][1001];
int n = in.nextInt();
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]);
}
}