动态规划-点数值三角形的最优路径搜索 java

本文探讨了如何解决一个经典的动态规划问题——在n行的点数值三角形中寻找数值和最小的路径。通过递归算法,从顶点开始,每一步可以沿着左斜或右斜向下,最终找到最优路径。以n=7的实例展示问题,并给出了Java代码实现,得出最小路径和为88,路径为44-L-5-R-31-R-4-L-4。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值