Problem Description:
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, wheren is the total number of rows in the triangle.
解决方案:利用动态规划,设triangle[n][n]为三角形的数,dp[n],dp[j]为从三角形顶部到第i层的第j个数的最小和,为了减小额外的空间,重复利用数组dp,在第I-1层的基础上,从后往前算第I层的数,dp[0]=triangle[0][0],
dp[i]=dp[i-1]+triangle[i][j], dp[0]=dp[0]+triangle[i][0],
dp[j]=min{dp[j],dp[j-1]}+triangle[i][j],其中0≤j≤i,i表示第I层,直到最后一层结束求出dp中的最小数即可.
代码如下:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int len=triangle.size();
int *dp=new int[len];
int i,j,min;
dp[0]=triangle[0][0];
min=dp[0];
for(i=1;i<len;i++)
{
dp[i]=dp[i-1]+triangle[i][i];
min=dp[i];
for(j=(i-1);j>0;j--)
{
if(dp[j]<=dp[j-1])
dp[j]=dp[j];
else
dp[j]=dp[j-1];
dp[j]+=triangle[i][j];
if(dp[j]<min)
min=dp[j];
}
dp[0]+=triangle[i][0];
if(dp[0]<min)
min=dp[0];
}
delete []dp;
return min;
}
};