算法描述
在一个n行的点数值三角形中,寻找从顶点开始每一步可沿着左斜或者右斜向下直到到达底端,使得每个点上的数值之和为最小
右图为一个4行的点数值三角形
算法思路
接收用户输入行数n
使用一个二维数组
a[n+1][n+1]
来存放各个点上的数值,数值可以由用户输入或者是随机生成定义一个二维数组(用来存放方向)
direction[n+1][n+1]
,存放1或0,1代表右
,0代表左
定义一个二维数组
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]其实是由逆推得到的,具体看下面
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]); }
结果
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦