数字三角形(dp)

问题

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

在上面的数字三角形中寻找一条从顶部到底边的路径,使得
路径上所经过的数字之和最大。路径上的每一步都只能往左下或
右下走。只需要求出这个最大和即可,不必给出具体路径。

三角形的行数大于1小于等于100,数字为 0 - 99

输入格式:

5 //三角形行数。下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
要求输出最大和 

 

思路:
dp[i][j]表示从q[i][j]到底边上点的各条路径的最大值
初始化:dp[n][i]=q[n][i] 最后一行的dp值就是各个点到自身的距离
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+q[i][j];

dp[1][1] 就是所求的值

 1 public class 数字三角形 {
 2     static final int N=110;
 3     static int n;
 4     static int q[][]=new int[N][N];
 5     static int dp[][]=new int[N][N];
 6         public static void main(String[] args) {
 7             Scanner sc=new Scanner(System.in);
 8             n=sc.nextInt();
 9             for(int i=1;i<=n;i++){
10                 for(int j=1;j<=i;j++){
11                     q[i][j]=sc.nextInt();
12                     
13                 }
14             }
15             //初始化dp数组
16             for(int i=1;i<=n;i++){
17                 dp[n][i]=q[n][i];  //初始化
18             }
19             for(int i=n-1;i>=1;i--){
20                 for(int j=1;j<=i;j++){
21                     dp[i][j]=Math.max(dp[i+1][j], dp[i+1][j+1])+q[i][j];
22                 }
23             }
24             System.out.println(dp[1][1]);
25         }
26 }

 

posted @ 2021-03-23 09:49  nb小歪  阅读(372)  评论(0)    收藏  举报