题目链接
思路:
可以发现,每次走一步都依赖于上一步的选择,最终要选择从顶点走到最后一行 和 最小的路径
采用动态规划,构建一个数组来存储每次选择走到当前节点的最小路径和。
代码以及注释已完善,如下:
public int minimumTotal(List<List<Integer>> triangle) {
if (triangle == null || triangle.get(0) == null || triangle.get(0).size() == 0) {
return 0;
}
// 三角形有几行
int row = triangle.size();
// 三角形最后一行有几列
int col = triangle.get(row - 1).size();
int[][] dp = new int[row][col];
// 三角形顶点位置的路径和为其本身
dp[0][0] = triangle.get(0).get(0);
// 从第一行开始
for (int i = 1; i < row; i++) {
// 由于是三角形,每一行的数字个数等于这一行的行号+1
for (int j = 0; j <= i; j++) {
// 当前结点,可以从上一行同下标处走到,也可以从上一行下标-1处走到
if (j > 0 && j <= i - 1) {
// 两条路选最小,加上当前结点
dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1])
+ triangle.get(i).get(j);
} else if (j == 0) { // 当前结点只能从上一行同下标处走到
dp[i][j] = dp[i - 1][j] + triangle.get(i).get(j);
} else { // 当前结点只能从上一行下标-1处走到
dp[i][j] = dp[i - 1][j - 1] + triangle.get(i).get(j);
}
}
}
int result = Integer.MAX_VALUE;
// 在最后一行中寻找最小的路径和
for (int j = 0; j < col; j++) {
result = Math.min(result, dp[row - 1][j]);
}
return result;
}