1. 题目

2. 思路
(1) 动态规划
- 这道题的状态转移方程是dp[i][j] = Math.min(dp[i + 1][j], dp[i + 1][j + 1]) + triangle[i][j],核心在于自底向上推导,而不是自顶向下推导。
- 存储最小路径和的二维数组的宽和高应该比原链表大1,方便最后一层计算。
(2) 动态规划优化
- 由于每次计算时只用到了上一层计算的结果,因此只需要一个一维数组保存上一层计算的结果即可,这一层计算的结果直接覆盖上一层计算的结果即可。
3. 代码
import java.util.List;
public class Test {
public static void main(String[] args) {
}
}
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int n = triangle.size();
int[][] dp = new int[n + 1][n + 1];
for (int i = n - 1; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
dp[i][j] = Math.min(dp[i + 1][j], dp[i + 1][j + 1]) + triangle.get(i).get(j);
}
}
return dp[0][0];
}
}
class Solution1 {
public int minimumTotal(List<List<Integer>> triangle) {
int n = triangle.size();
int[] dp = new int[n + 1];
for (int i = n - 1; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
dp[j] = Math.min(dp[j], dp[j + 1]) + triangle.get(i).get(j);
}
}
return dp[0];
}
}