三角形最小路径和(动态规划入门篇)

题目

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

例如,给定三角形:

[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]

自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

PS:

如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

思路

可以使用递归来解决此问题,但是由于每一层都要重复的计算,所以时间上可能会很费时。

本题的最优解是自下而上的动态规划算法。

从倒数第二层开始,以点(l,r)为例,我们需要算出它与(l+1,r)和(l+1,r+1)之和哪个比较小,然后储存到一个一维数组中(也可以就地保存,但是会污染原数据)。然后倒数第三行只需要和储存的倒数第二行比,然后再把数据保存到那个数组中,一直到第一行结束,这个数组的第一个值即为最短路径。

我们把大的问题分解为了,倒数第二行到倒数第一行的最短路径、倒数第三行到倒数第二行的最短路径…并且每一个问题都与上一个问题的答案有关,所以这是一种典型的动态规划问题。

代码

class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
if (triangle == null) {
return 0;
}
int[] dps = new int[triangle.size() + 1];

for (int i = triangle.size() - 1; i >= 0; i--) {
List<Integer> lineDate = triangle.get(i);

for (int j = 0; j < lineDate.size(); j++) {
dps[j] = Math.min(dps[j], dps[j + 1]) + lineDate.get(j);
}
}

return dps[0];
}
}

leetcode展示

三角形最小路径和(动态规划入门篇)_最短路径