难度
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
示例1:
输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]输出:11解释:如下面简图所示:23 46 5 74 1 8 3自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
示例2:
输入:triangle = [[-10]]输出:-10
提示:
- 1 <= triangle.length <= 200
- triangle[0].length == 1
- triangle[i].length == triangle[i - 1].length + 1
-
题解
每个点的最小路径和,依赖于其上一行的相同位置和前一位置 即
dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1]) + curVal;ps:需要处理最右边界的点的问题,因为每一行的最右边界,他的上一行相同位置是无的。所以在最右边界时,dp[i][j] = dp[i - 1][j - 1] + curVal,又因为最右边界的index = i,so dp[i][i] = dp[i - 1][i - 1] + curVal
class Solution {// dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1]) + curVal;public int minimumTotal(List<List<Integer>> triangle) {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++) {dp[i][0] = dp[i - 1][0] + triangle.get(i).get(0);}for(int i = 1; i < row; i++) {for(int j = 1; j < i; j ++){dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1]) + triangle.get(i).get(j);}// 最右边界处理dp[i][i] = dp[i - 1][i - 1] + triangle.get(i).get(i);}int min = dp[row - 1][0];for(int i = 1; i < col; i++) {min = Math.min(min, dp[row - 1][i]);}return min;}}
