题目
动态规划
public int minimumTotal(List<List<Integer>> triangle) {
int height = triangle.size();
int maxWidth = triangle.get(triangle.size() - 1).size();
int [][] dp = new int[height][maxWidth];
for (int i = 0; i < height; i ++) {
for (int j = 0; j < i + 1; j ++) {
if (i == 0) {
dp[i][j] = triangle.get(i).get(j);
} else {
if (j == 0) {
dp [i][j] = triangle.get(i).get(j) + dp[i - 1][j];
} else if (j == triangle.get(i).size() - 1) {
dp [i][j] = triangle.get(i).get(j) + dp[i - 1][j - 1];
} else {
dp [i][j] = triangle.get(i).get(j) + Math.min(dp[i - 1][j], dp[i - 1][j - 1]);
}
}
}
}
int min = Integer.MAX_VALUE;
for (int i = 0; i < maxWidth; i ++) {
min = Math.min(min, dp[height - 1][i]);
}
return min;
}
基本思路
-
首先该问题不是一个最优问题, 因为可达的位置是有限制的, 因此需要按层求出每一层的可能结果
-
从第0层开始, 计算到达每一层每个位置的最小路径和, 每一层的计算只和上一层的数据有关, 状态转移方程: dp[i][j] = nums[i][j] + Math.min(dp[i - 1][j], dp[i - 1][j - 1]), 需要注意每一层边界两个元素的计算方式
-
最终结果为三角形最后一层的最小值