6、2021/1/20 数字三角形
- 数字三角形
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
输入格式
第一行包含整数n,表示数字三角形的层数。
接下来n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。
输出格式
输出一个整数,表示最大的路径数字和。
数据范围
1≤n≤5001≤n≤500,
−10000≤三角形中的整数≤10000−10000≤三角形中的整数≤10000输入样例:
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
输出样例:
30
方法一:
import java.util.*;
public class Main{
static final int N = 510;
static int[][] w;
static int[][] f;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
w = new int[N][N];
f = new int[N][N];
int n = sc.nextInt();
//输入数据
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= i ; j ++){
w[i][j] = sc.nextInt();
}
}
//边界初始化
for(int i = 1 ; i <= n ; i ++){
f[n][i] = w[n][i];
}
for(int i = n ; i > 0 ; i --){
for(int j = 1 ; j <= i ; j ++){
f[i][j] = Math.max(f[i + 1][j] + w[i][j] , f[i+1][j+1]+w[i][j]);
}
}
System.out.println(f[1][1]);
}
}
方法二:简化
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int [][] f = new int[510][510];
int n = sc.nextInt();
for(int i = 1 ; i <= n ;i++){
for(int j = 1 ; j <= i ; j++){
f[i][j] = sc.nextInt();
}
}
for(int i = n ; i > 0 ; i--){
for(int j = 1 ; j <= i ; j++){
f[i][j] += Math.max(f[i+1][j], f[i+1][j+1]);
}
}
System.out.println(f[1][1]);
}
}