120.三角形最小路径和
题目
- 给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
例题
[
[ 2 ],
[3 , 4 ],
[6 , 5 , 7 ],
[ 4 , 1 ,8 , 3 ]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
解题
动态规划:从上或者从下依次往上遍历,直到走到终点,比较最短的路程。

可以发现:从上—除了两侧的只有一条路来 / 从下—都是有两条路来
从上到下
1 2 3
| 第一个:res[i][0] = res[i-1][0] + triangle[i][0]; 中间的:res[i][j] = triangle[i][j] + min(res[i-1][j-1],res[i-1][j]); 最后个:res[i][i] = res[i-1][i-1] + triangle[i][i];
|
1
| triangle[i][j] += min(triangle[i+1][j],triangle[i+1][j+1]);
|
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| int minimumTotal(vector<vector<int>>& triangle) {
int lenX = triangle.size(); vector<vector<int>>res(lenX, vector<int>(lenX, 0)); res[0][0] = triangle[0][0]; for (int i = 1; i < lenX; i++) { int temp = i; res[i][0] = res[i - 1][0] + triangle[i][0]; for (int j = 1; j < temp; j++) { res[i][j] = triangle[i][j] + min(res[i - 1][j - 1], res[i - 1][j]); } res[i][temp] = res[i - 1][temp - 1] + triangle[i][temp]; } sort(res.back().begin(), res.back().end()); return res.back()[0]; }
|
1 2 3 4 5 6 7 8 9 10
| int minimumTotal(vector<vector<int>>& triangle) { int n = triangle.size();
for (int i = n - 2; i >= 0; i--) { for (int j = 0; j <= i; j++) { triangle[i][j] += min(triangle[i + 1][j], triangle[i + 1][j + 1]); } } return triangle[0][0]; }
|