一 题目
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,更新到达这个点的最小路径权值,最后遍历一遍底层的值,最小的就是答案。三 代码
python3:120. Triangle
class Solution:
def minimumTotal(self, triangle):
"""
:type triangle: List[List[int]]
:rtype: int
"""
n = len(triangle)
dp = [[0 for col in range(n)] for row in range(n)]
dp[0][0] = triangle[0][0]
ans = 200000000
for i in range(1, n):
for j in range(i + 1):
if j == 0:
dp[i][j] = dp[i-1][0] + triangle[i][j]
elif j == i:
dp[i][j] = dp[i-1][j-1] + triangle[i][j]
else:
dp[i][j] = min(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j]
for i in range(n):
ans = min(ans, dp[n-1][i])
return ans
C++:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n = triangle.size();
int dp[n+2][n+2], ans = 2000000000;
dp[0][0] = triangle[0][0];
for(int i = 1; i < n; i++) {
for(int j = 0; j <= i; j++) {
if(j == 0)
dp[i][j] = dp[i-1][0] + triangle[i][j];
else if(j == i)
dp[i][j] = dp[i-1][j-1] + triangle[i][j];
else
dp[i][j] = min(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j];
}
}
for(int i = 0; i < n; i++) {
ans = min(ans, dp[n-1][i]);
}
return ans;
}
};