Leetcode-120-三角形最小路径和

题目

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

相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。

例如,给定三角形:

image-20200714105032667

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

动态规划

假设dp[i][j]是处于位置(i, j)时的最小路径总和.

由于位置(i, j)只能从位置(i-1,j-1)和位置(i-1, j)过来, 那么可以很容易的知道动态转移方程为:

dp初始化

dp所有元素初始赋值为Integer.MAX_VALUE, 方便进行比较最小值.

需要注意的是, dp[i][0]只能从上方转移, 所以初始化的时候需要另外处理.

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int n = triangle.size();
int[][] dp = new int[n][n];

// dp初始化
for (int i = 0; i < n; i++) {
Arrays.fill(dp[i], Integer.MAX_VALUE);
}
dp[0][0] = triangle.get(0).get(0);
for (int i = 1; i < n; i++) {
dp[i][0] = triangle.get(i).get(0) + dp[i - 1][0];
}

for (int i = 1; i < n; i++) {
for (int j = 1; j <= i; j++) {
dp[i][j] = Math.min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle.get(i).get(j);
}
}

int min = Integer.MAX_VALUE;
for (int j = 0; j < n; j++) {
if (dp[n - 1][j] < min) {
min = dp[n - 1][j];
}
}
// for (int i = 0; i < n; i++) {
// System.out.println(Arrays.toString(dp[i]));
// }
return min;
}
}

image-20200714105910433