数字三角形-递归和动态规划

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字三角形-递归和动态规划相关的知识,希望对你有一定的参考价值。

数字三角形-递归和动态规划


输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

输出:
30

方法1:递归,自顶向下,当前数字+max(左下路径,右下路径)

import java.util.Scanner;

public class NumberTriangle {
    public static int max1(int [][] arr, int i, int j){
        int rowIndex = arr.length ;
        if(i == rowIndex - 1){
            return arr[i][j] ;
        }else{ //当前数字+max(左下路径,右下路径)
            return arr[i][j] + Math.max(max1(arr,i+1, j), max1(arr, i+1, j+1)) ;
        }
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in) ;
        int n = input.nextInt() ;
        int [][] arr = new int [n][] ;
        for(int i=0; i<n; i++){ //为二维数组分配空间
            arr[i] = new int[i+1] ;
        }
        for(int i=0; i<n; i++){
            for(int j=0; j<i+1; j++){
                arr[i][j] = input.nextInt() ;
            }
        }
        System.out.println(max1(arr,0,0)) ;
    }
}

方法2:动态规划(二维数组),自底向上,先更新最后一行的dp数组,从倒数第2行依次向上走,该位置dp数组值=该位置原数组值+max(左下dp,右下dp)

import java.util.Scanner;

public class NumberTriangle {
    public static void dynamic(int [][] triangle){ //自底向上的构造思路
        int row = triangle.length ;
        int column = triangle[row-1].length ;
        int [][] dp = new int [row][column] ;
        for(int k=0; k<column; k++){ //初始化最后一行
            dp[row-1][k] = triangle[row-1][k] ;
        }
        //从倒数第二行开始,依次向上走
        for(int k=column-2; k>=0; k--){
            for(int l=0; l<=k; l++){ //该位置dp数组值=该位置原数组值+max(左下dp,右下dp)
                dp[k][l] = triangle[k][l] + Math.max(dp[k+1][l], dp[k+1][l+1]) ;
            }
        }
        System.out.println(dp[0][0]) ;
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in) ;
        int n = input.nextInt() ;
        int [][] triangle = new int [n][] ;
        for(int i=0; i<n; i++){
            triangle[i] = new int [i+1] ;
        }
        for(int i=0; i<n; i++){
            for(int j=0; j<i+1; j++){
                triangle[i][j] = input.nextInt() ;
            }
        }
        dynamic(triangle) ;
    }
}

方法3:动态规划(一维数组):利用滚动数组,节约存储空间。

import java.util.Scanner;

public class NumberTriangle1 {
    public static void dynamic(int [][] triangle){
        int row = triangle.length ;
        int column = triangle[row-1].length ;
        int [] dp =  new int [column] ;
        for(int i=0; i<column; i++){
            dp[i] = triangle[row-1][i] ;
        }
        for(int i=row-2; i>=0; i--){
            for(int j=0; j<=i; j++){
                dp[j] = triangle[i][j] + Math.max(dp[j+1], dp[j]) ;
            }
        }
        System.out.println(dp[0]) ;
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in) ;
        int n = input.nextInt() ;
        int [][] triangle = new int [n][] ;
        for(int i=0; i<n; i++){
            triangle[i] = new int [i+1] ;
        }
        for(int i=0; i<n; i++){
            for(int j=0; j<i+1; j++){
                triangle[i][j] = input.nextInt() ;
            }
        }
        dynamic(triangle) ;
    }
}

以上是关于数字三角形-递归和动态规划的主要内容,如果未能解决你的问题,请参考以下文章

动态规划----数字三角形问题

数字三角形,从递归到动态规划

递归与动态规划----基础篇2

动态规划入门(dp)

动态规划

数字三角形