给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。
样例
比如,给出下列数字三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
从顶到底部的最小路径和为11 ( 2 + 3 + 5 + 1 = 11)。
这是一道典型的动态规划问题,与一般的问题不同的是,这里的初始化不用特别列出来,而且也不是从头开始,从最优子结构的角度来看,从第一层到最后一层的路径中任选一段都是最小的,而这题如果从上层开始,得到的结果只能保留在上层,并不能被下层的利用,所以从下层开始。
将下层路上的最短路加到身上,它本身就代表了通往下层的路,这样就可以通过迭代,到最后就相当于是把所有路径都比了一边。因为到最后只剩了两条路,而第一层要从这两条路中选择短的那条。具体为什么这么做,我也不清楚。只知道这样是对的,我半懂不懂的记下,就当做个笔记。
public class Solution {
/**
* @param triangle: a list of lists of integers
* @return: An integer, minimum path sum
*/
public int min(int x,int y){
return x>y? y:x;
}
public int minimumTotal(int[][] D) {
int num=D.length;
for(int i = num - 2; i >= 0; i --){//从倒数第二层开始
for(int j = 0; j <= i; j ++){
D[i][j] = min(D[i+1][j],D[i+1][j+1]) + D[i][j];
}
}
//将 得到的路径最小值 放在 D[i][j] 上。不断迭代上去 直到 D[0][0]
// 得到最终迭代的 结果
return D[0][0];
}
}
参考文章:https://www.cnblogs.com/ygtzds/archive/2017/10/18/7689017.html