这是寒假打卡第2天,同样也是DP问题-数字三角形问题
题目描述:
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
package simple; import java.util.Scanner; //数字最大和问题 //思路: public class day4 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); final int N = 510; int[][] f = new int[N][N]; int [][] w = 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 -1 ; i >= 0 ; i --){ for(int j = 1; j <= n ; j ++){ //f[i][j]:从下往上走,使得到达(i,j)的路径权值最大的路线下的最大路径值。 f[i][j] = Math.max(f[i + 1][j] ,f[i + 1][j + 1]) +w[i][j]; // 7 // 2 5 // 5 9 6 // 8 5 2 1 //如上述例子,想象成二维数组,w[1][1] = 7 // f[1][1]表示从第四层往上遍历得到的最大路径值 //Math.max(f[i + 1][j],f[i + 1][j + 1]) + w[i][j]; // 就是(i,j)的下面左右两点的最大值再加上(i,j)本身的权重w[i][j]; //i控制行数,j控制每个行数中的对应的列。 //不难得出,遍历范围控制在j:1~n,i的范围在n - 1 ~ 0 } } System.out.println(f[1][1]); } }
收获了一般DP问题的思路!