三角形最短路径问题
问题描述:给出如图所示的三角形,从顶点开始,求出从顶点开始到最下一层所经过的元素的最小路径和。
例如:
从顶点到底边的最小路径和为: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]&