120. 三角形最小路径和
——————————————————————————————————————————
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/triangle
——————————————————————————————————————————
1、动态规划
题目要找自顶向下的最短路径和,则可以逆向思考。自下向顶返回寻找最短路径和。比如题目给的例子中,对于第三行的6,考虑第四行的4和1,选择较小的1,把6变为7,则是第三行的6到最下层的最短路径和,同理,对于第三行的5,最小路径和为6,7的最小路径和为10。得到第三行到最下层的最短路径和,接着考虑第二层到最下层的最短路径和,因为第三层的路径变为第三层到最下层的最短路径和,则可以得到第二层到最下层的最短路径和,同理,不断迭代,就可以得到自顶向下的最短路径和。具体的C++代码如下:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int hang = triangle.size(); #计算数组的行数
for(int i=hang-2;i>=0;i--) #逆向计算,从最底层开始返回统计
{
int lie=triangle[i].size(); #对于每一层,计算每一层的数据的个数
for(int j=0;j<lie;j++)
{
triangle[i][j] = triangle[i][j] + min(triangle[i+1][j],triangle[i+1][j+1]); #计算每一层到其下面层的最短路径和
}
}
return triangle[0][0]; #返回最上端的值
}
};