Leetcode(剑指offer专项训练)——DP专项(2)
三角形中最小路径之和
1.题目描述
给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
链接
2.思路题解
首先想到的最简单的思路是dp存储每个位置对应的最小路径和,每一个位置对应的可能的路径和=min(dp(i-1,j-1),dp(i-1,j)),对于边界条件需要针对性的特别制定,于是题解如下:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int m=triangle.size();
if(m==1){
return triangle[0][0];
}
vector<vector<int> >dp(m);
dp[0]=vector<int>(1);
dp[0][0]=triangle[0][0];
int ans=999999;
for(int i=1;i<m;i++){
dp[i]=vector<int>(i+1);
dp[i][0]=dp[i-1][0]+triangle[i][0];
if(i==m-1&&dp[i][0]<ans){
ans=dp[i][0];
}
for(int j=1;j<i;j++){
dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+triangle[i][j];
if(i==m-1&&ans>dp[i][j]){
ans=dp[i][j];
}
}
dp[i][i]=dp[i-1][i-1]+triangle[i][i];
if(i==m-1&&ans>dp[i][i]){
ans=dp[i][i];
}
}
return ans;
}
};
本文来自博客园,作者:理想国的糕,转载请注明原文链接:https://www.cnblogs.com/SaltyCheese/p/17253145.html嗷~