题目链接:Triangle
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
For example, given the following triangle
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).
Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.
这道题的要求是给定一个三角形,找到从上到下和最小的路径。每一步可能移动到下面行的相邻数字。
动态规划,找从上到下的最小路径,可以采用数组来存储到达某一行的所有位置的最短路径,最后在从中找出最小的即可。递推公式如下:
- 当为该行最后一个元素的时候,dp[i] = dp[i - 1] + triangle[i][i];
- 当为该行第一个元素的时候,dp[0] = dp[0] + triangle[i][0];
- 其他情况,dp[j] = min(dp[j - 1], dp[j]) + triangle[i][j]。
时间复杂度:O(n2)
空间复杂度:O(n)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution
{
public:
int minimumTotal(vector<vector<int> > &triangle)
{
int n = triangle.size();
vector<int> vi(n, 0); // 存储最小路径
for(int i = 0; i < n; ++ i)
{
if(i > 0) // 不是第0行的情况,处理最后一个元素
vi[i] = vi[i - 1] + triangle[i][i];
for(int j = i - 1; j > 0; -- j)
vi[j] = min(vi[j - 1], vi[j]) + triangle[i][j];
vi[0] += triangle[i][0]; // 第一个元素
}
return *min_element(vi.begin(), vi.end());
}
};