1案例提出
在一个n行的点数值三角形中,寻找从顶点开始每一步可沿左斜(L)或右斜(R)向下至底的一条路径,使该路径所经过的点的数值和最小。
例如,n=7时给出的点数值三角形如图所示,如何寻找从项到底的数值和最小路径?该最优路径的数值和为多少?
思路:
问题:求 d(1,1)典型的递归问题。a(i, j)出发,下一步只能走a(i+1,j)或者a(i+1, j+1)。故对于N行的三角形:if ( i== N) d(i,j) = D(i,j)else d( i, j) = Max{ d(i+1,j), d(i+1,j+1) } + a(i,j)
package basic_PRactice;import java.util.Scanner;public class anlian_bfs { public static void main(String[] args) { int a[][]=new int[50][50]; //各个点的数据 int b[][]=new int[50][50]; //数组b[i,j]为点(i,j)到底的最小数值和 char stm[][]=new char[50][50]; //字符数组stm[i,j]指明点(i,j)向左或向右的路标 int n,i,j; Scanner in=new Scanner(System.in); n=in.nextInt(); for(i=1;i<=n;i++) {for(j=1;j<=36-2*i;j++) System.out.print(" ");//让数字在控制台中间输出 for(j=1;j<=i;j++) {a[i][j]=(int)(1+Math.random()*(50-1+1));//产生1-50的随机数 System.out.print(a[i][j]+" "); // 打印n行数字三角形 } System.out.println(); } System.out.println("请在以上点数值三角形中从顶开始每步可左斜或右斜至底"); System.out.println("寻找一条数字和最小的路径./n "); for(j=1;j<=n;j++) b[n][j]=a[n][j]; //边界条件,a[n][j]是底边,所以,b[n][j]开始走,只能走一步 for(i=n-1;i>=1;i--) // 逆推得b[i][j] 从最底层推到b[1][1] for(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];stm[i][j]='R';} else {b[i][j]=a[i][j]+b[i+1][j];stm[i][j]='L';} System.out.println("最小路径和为:/n"+b[1][1]); // 输出最小数字和 System.out.print("最小路径为:/n"+a[1][1]); j=1; // 输出和最小的路径 for(i=2;i<=n;i++) if(stm[i-1][j]=='R') { System.out.print("-R-"+a[i][j+1]);j++;} else System.out.print("-L-"+a[i][j]); System.out.println(); }}输入:5输出: 44 5 23 25 31 13 46 38 4 9 22 9 4 9 8 请在以上点数值三角形中从顶开始每步可左斜或右斜至底寻找一条数字和最小的路径. 最小路径和为:88最小路径为:44-L-5-R-31-R-4-L-4
新闻热点
疑难解答