数字三角形(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 }