题目链接:https://leetcode-cn.com/problems/triangle/
思路:
动态规划,直接左对齐,
当j==0时dp[i][j]=dp[i-1][j]+c[i][j]
当j==i时dp[i][j]=dp[i-1][j-1]+c[i][j]
其余情况dp[i][j]=min(dp[i-1][j],dp[i-1][j-1])+c[i][j]
注意,这个三角形数字数目是每层数目加1,开始误以为三角形不规则。导致DFS做法超时
还可以考虑将j反向遍历,将空间复杂度优化为O(n)
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int len1=triangle.size();
int len2=triangle[len1-1].size();
int dp[len1][len2];
dp[0][0]=triangle[0][0];
int result=INT_MAX;
if(len1==1)return triangle[0][0];
for(int i=1;i<len1;i++)
{
for(int j=0;j<i+1;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];
}
if(i==len1-1)result=min(result,dp[i][j]);
}
}
return result;
}
};