Come from : [https://leetcode-cn.com/problems/triangle/]
120. Triangle
1.Question
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.
2.Answer
medium 类型题目。.
算法思路:
- 设置一个二维数组,最优值三角形dp[][], 并初始化数组元素为0. dp[i][j]代表了从底向上递推时,走到三角形第i行第j列最优解。
- 从三角形的底面向三角形上方进行动态规划:
a.)动态规划边界条件:底面上的最优值即为数字三角形的最后一层。
b.)利用i循环,从倒数第二层递推第一层,对于每层的各列,进行动态规划递推。
c.)第i行,第j列的最优解为dp[i][j],可达到(i ,j)的这两个位置的最优解dp[i+1][j]、dp[i+1][j+1]:
动态规划方程为:dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j]。
d.)但会dp[0][0]
AC代码如下:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
if(triangle.size() == 0)
{
return 0;
}
vector<vector<int> > dp; //创建最优值三角形数组,并初始化为0
for(int i = 0; i < triangle.size(); ++i)
{
dp.push_back(vector<int>());
for(int j = 0; j < triangle[i].size(); ++j)
{
dp[i].push_back(0);
}
}
for(int i = 0; i < dp.size(); ++i)
{
dp[dp.size() - 1][i] = triangle[dp.size() - 1][i];
}
for(int i = dp.size() - 2; i >= 0; i--)
{
for(int j =0; j <dp[i].size(); j++)
{
dp[i][j] = min(dp[i+1][j], dp[i+1][j+1])+ triangle[i][j];
}
}
return dp[0][0];
}
};
3.我的收获
动态规划进阶。。。
fighting。。。
2019/6/5 胡云层 于南京 94