一、题目
问题描述
(图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
径,使该路径所经过的数字的总和最大。
●每一步可沿左斜线向下或右斜线向下走;
●1<三角形行数≤100;
●三角形中的数字为整数0,1,…99;
.
(图3.1-1)
输入格式
文件中首先读到的是三角形的行数。
接下来描述整个三角形
输出格式
最大总和(整数)
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
二、分析
题目中提到了每一步可沿左斜线向下或右斜线向下走,当把上图中那样一个三角形存储到一个二维数组中时,这句话就可以转化为每一步可沿着竖直方向,对角线方向向下走。
如果想让a[i - 1][j]取得最大值应该先取得a[i+1][j]和a[i+1][j+1]中最大的一个再加上自身的值。
a[i-1][j]=Max{a[i+1][j],a[i+1][j+1]}+a[i-1][j];
public class Question124 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] 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();
}
}
// 逆推---从三角形的最底端向上求解
// 如果写成正推,则用到递归,,,,,,
for (int i = n; i >= 1; i--) {
for (int j = 1; j <= i - 1; j++) {
// 取最大值
a[i - 1][j] += Math.max(a[i][j], a[i][j + 1]);
}
}
System.out.println(a[1][1]);
}
}
Treasure this day and treasure yourself because neither will ever happen again.