JAVA算法:三角形最短路径问题(动态规划求解)

这篇博客介绍了如何使用动态规划算法解决三角形最短路径问题。通过最优子结构和子问题重叠性质分析,提出了一种自底向上计算的递推方法,定义了d[i][j]表示从顶点到a[i][j]的最小路径和,并给出了初始化和递推公式。此外,还提及存在其他不同的算法设计。
摘要由CSDN通过智能技术生成
三角形最短路径问题

问题描述:给出如图所示的三角形,从顶点开始,求出从顶点开始到最下一层所经过的元素的最小路径和。
例如:

最小路径和

从顶点到底边的最小路径和为:17 (i.e., 7 + 3 + 1 + 4 + 2 = 11).

问题分析:
该问题可以考虑采用动态规划算法解决。
动态规划是针对一类求最优解的问题的算法, 其核心是将一个问题分解成为若干个子问题(这里对应下文的子问题使用条件), 部分类似于分治的思想, 通过求每一次的最优决策, 来得到一个最优解。在这里最重要的就是子问题的思想。

最优子结构性质和子问题重叠性质是该问题可用动态规划算法求解的基本要素:

1、最优子结构

当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。问题的最优子结构性质提供了该问题可用动态规划算法求解的重要线索。在动态规划算法中,利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。

2、重叠子问题

可用动态规划算法求解的问题应具备的另一个基本要素是子问题的重叠性质。在用递归算法自顶向下求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要此子问题时,只要简单地用常数时间查看一下结果。通常,不同的子问题个数随问题的大小呈多项式增长。因此,用动态规划算法通常只需要多项式时间,从而获得较高的解题效率。

算法设计:

定义:d[i][j]表示从a[0][0]到a[i][j]的最小路径和,其中j<=i
初始化:计算d[i][0]
递推表达式:
如果i=j,d[i][j]=a[i][j]+d[i-1][j-1]
否则d[i][j]=a[i][j]+MIN{d[i-1][j],d[i-1][j-1]}

public static int minTotalSolution5(List<List<Integer>> triangle) {  
		    if(triangle.size()==0||triangle.get(0).size()==0){  
		        return 0;  
		    }  
		    int m=triangle.size();
		    int n=m;  
		    int[][] d = new int[m][n];  
		    int sum=0;  
		    for(int i=0;i<m;i++){  
		        sum+=triangle.get(i).get(0);  
		        d[i][0]&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值