Leetcode120. 三角形最小路径和
题目描述
/**
* 给定一个三角形 triangle ,找出自顶向下的最小路径和。
* <p>
* 每一步只能移动到下一行中相邻的结点上。
* 相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。
* 也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
*/
思路分析
- 三角形最小路径和,即从最顶层到最底层对各层元素累加求最小值
- 规定下一层元素可以走的位置只能是上一层同列的元素或前一列的元素
- 创建二维动态规划数组,依次生成每一层的所有路径和
- 由题目很容易得出状态转移方程,但要注意动态规划数组的第一列和最后一列的位置元素生成与其他位置不同
- 第一列直接由上一层同列元素加当前位置元素生成,最后一列直接有(i - 1)行和列位置元素+当前位置元素生成
- 源码见下
源码及分析
/**
* 动态规划
* @param triangle 三角形
* @return 返回最小路径
*/
public int minimumTotal(List<List<Integer>> triangle) {
//三角形的层数,即三角形有多高
int n = triangle.size();
//动态规划数组
int[][] f = new int[n][n];
//初始化动态规划数组的第一行
f[0][0] = triangle.get(0).get(0);
//使用循环动态的填充二维数组
for (int i = 1; i < n; i++) {
//数组的第一列只能是上一列相同位置的数 + 当前位置的数
f[i][0] = f[i - 1][0] + triangle.get(i).get(0);
//由状态转移方程生成其他位置的元素
for (int j = 1; j < i; j++) {
f[i][j] = Math.min(f[i - 1][j - 1], f[i - 1][j]) + triangle.get(i).get(j);
}
//数组的最后一列(i - 1)位置行和列元素+当前位置的元素
f[i][i] = f[i - 1][i - 1] + triangle.get(i).get(i);
}
//遍历数组的最后一列记录最小值并返回
int min = f[n - 1][0];
for (int i = 1; i < f[n - 1].length ; i++) {
if (min > f[n - 1][i]){
min = f[n - 1][i];
}
}
return min;
}