这里给出了动态规划基础题的第二个例子,我们用四步分析法求解该题目。
题目描述:
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
相邻的结点 在这里指的是 下标
与 上一层结点下标
相同或者等于 上一层结点下标 + 1
的两个结点。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11
(即,2 + 3 + 5 + 1 = 11)。
分析:
- 问题拆解
下一层的某个位置的值一定是会经过上面一层相邻的两个数的其中一个。
- 状态定义
我们可以将状态map[ i ][ j ]定义为从上或者从下走最短的路径,我们可以选择从上走或者从下走,从上面走的话,下面一层的数肯定会经过上面的数,而且下面一层两端的数只能是经过上面一层两端的唯一数,而下面一层除开两端的数则有两种路径可以选择,所以我们可以选择从下往上走,状态map[ i ][ j ]则可定义为从上往下到该点的最小路径。
-
递推方程
实现
Java
/*
* @lc app=leetcode.cn id=120 lang=java
*
* [120] 三角形最小路径和
*/
// @lc code=start
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int n = triangle.size();
int[][] map = new int[n][n];
List<Integer> lastRow = triangle.get(n - 1);
for(int i = 0; i <= n - 1; i++){
map[n - 1][i] = lastRow.get(i);
}
for(int i = n - 2; i >= 0; i--){
List<Integer> row = triangle.get(i);
for(int j = 0; j < i + 1; j++){
map[i][j] = Math.min(map[i + 1][j], map[i + 1][j + 1]) + row.get(j);
}
}
return map[0][0];
}
}
// @lc code=end
Python
待添加