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

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

在这里插入图片描述
输入:
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) ;
    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuist__NJUPT

给个鼓励吧,谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值