为了账号安全,请及时绑定邮箱和手机立即绑定

算法学习——动态规划之点数值三角形的最小路径

标签:
算法

算法描述

在一个n行的点数值三角形中,寻找从顶点开始每一步可沿着左斜或者右斜向下直到到达底端,使得每个点上的数值之和为最小

右图为一个4行的点数值三角形
5beaef9d0001228802640173.jpg

算法思路

  1. 接收用户输入行数n

  2. 使用一个二维数组a[n+1][n+1]来存放各个点上的数值,数值可以由用户输入或者是随机生成

  3. 定义一个二维数组(用来存放方向)direction[n+1][n+1],存放1或0,1代表右0代表左

  4. 定义一个二维数组b[n+1][n+1] 表示到底端的数值之和

    以上图4行的点数值三角形为例

    b[4][1]=47 b[4][2]=93

    b[3][1]=43

    这里b[3][1]是可以等于47,也可以等于93,但题目要求的是最小,所以这里取小的值

    b[3][1]其实是由逆推得到的,具体看下面

  5. b[n+1][n+1]的递推关系

  • 初始值

    从最后一行开始

    b[n][i]=a[n][i] i遍历完最后一行的所有元素

  • 递推关系

    b[n][i]=Math.min(b[n+1][i],b[n+1][i+1]) 取最小值

算法实现

    System.out.println("输入数字三角形的行数n:");
    Scanner scanner = new  Scanner(System.in);    int n = scanner.nextInt();
    scanner.close();    int[][] a= new int[n+1][n+1];    //随机赋值数字三角形
    for(int i=1;i<n+1;i++){        for(int j =1;j<=i;j++){
            a[i][j] = (int) (Math.random()*100);
        }

    }    //输出数字三角形
    for(int i=1;i<n+1;i++){        for(int j =1;j<=i;j++){
            System.out.print(a[i][j]+"    ");
        }
        System.out.println("");

    }    int[][] b = new int[n+1][n+1];    int[][] direction = new int[n+1][n+1];//0是左,1是右

    //最后一行的长度为其本身
    for(int i=1;i<n+1;i++){
        b[n][i] = a[n][i];
    }    //关键逆推代码
    for(int i=n-1;i>=1;i--){        for(int j=1;j<=i;j++){            if(b[i+1][j+1]<b[i+1][j]){
                b[i][j]=a[i][j] + b[i+1][j+1];
                direction[i][j]=1;//右边的数值较大,则记录方向为右

            }else{
                b[i][j]=a[i][j] + b[i+1][j];
                direction[i][j]=0;//左边的数值较大,则记录方向为左
            }
        }
    }
    System.out.println("最小路径和为"+b[1][1]);    int flag = 1;    int j=1;    //循坏结束
    while(flag!=n){
        System.out.print(a[flag][j]);        if(direction[flag][j]==1){
            System.out.print("->向右");
            flag++;
            j++;

        }else{
            System.out.print("->向左");
            flag++;
        }

    }
    System.out.print("->"+a[flag][j]);

}

结果

5beaef9d0001190102410181.jpg

原文出处:https://www.cnblogs.com/kexing/p/9954821.html  

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消