898 数字三角形
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输入格式
第一行包含整数n,表示数字三角形的层数。
接下来n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。
输出格式
输出一个整数,表示最大的路径数字和。
数据范围
1
≤
n
≤
500
1≤n≤500
1≤n≤500
−
10000
≤
三
角
形
中
的
整
数
≤
10000
−10000≤三角形中的整数≤10000
−10000≤三角形中的整数≤10000
输入样例:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例:
30
题目需要注意的点
这道题我认为最容易错的点就是边界问题。
一般就是就是向下走,和向上爬两种思路,向上爬的思路可以不需要考虑边界问题。
而当向下走的时候,需要考虑边界问题。如输入样例中第二行的8,只能从左上角的7下来,右上角没有数。处理起来要考虑的东西多很多,因此我们选择向上爬的思路。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] arr = new int[n][n];//三角形矩阵,用n*n存储,多出的默认是0
int[][] dp = new int[n][n];//dp矩阵,存储从底部到三角形矩阵每个点的所有路径的最大值
for(int i = 0;i < n;i++){
for(int j = 0;j <= i;j++ ){
arr[i][j] = scanner.nextInt();
}
}
//初始化dp,dp从底部开始,故dp[n-1][i] = arr[n-1][i]
for(int i = 0;i < n;i++){
dp[n-1][i] = arr[n-1][i];
}
for(int i = n-2;i >= 0;i--){
for(int j = 0;j < arr[i].length - 1;j++){
dp[i][j] = Math.max(dp[i+1][j],dp[i+1][j+1]) + arr[i][j];
}
}
System.out.println(dp[0][0]);
}
}