题目描述:
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.
本题需要采用动态规划来解决。我们用一个二维数组dp[i][j]来表示在题中三角形中,到达三角形的第i行,第j列的路径的权值之和。该动态规划算法的状态转移方程如下:当我们要计算dp[i][j]的值,我们需要利用上一层已经算好的信息,即从dp[i-1][j-1]+triangle[i][j]和dp[i-1][j]+triangle[i][j]这两个数中取一个最小值。因为位置(i,j)只能由上一层的位置(i-1,j-1)或者位置(i-1,j)往下走来获得,而到达上一层的最小代价我们也已经计算得出,那么就可以利用这两个值来算出到达位置(i,j)的最小代价。在边界时,位置(i,0)则只能由(i-1,0)往下走得到,最后一个位置只能由上一行的最后一个位置往下走来获得。代码实现如下:
int minimumTotal(vector<vector<int>>& triangle)
{
if (triangle.size() == 0)
return 0;
vector<vector <int> > dp(triangle.size(), vector<int>(triangle[triangle.size()-1].size(), 0));
dp[0][0] = triangle[0][0];
for (int i = 1; i < triangle.size(); i++)
{
for (int j = 0; j < triangle[i].size(); j++)
{
if (j == 0)
{
dp[i][j] = dp[i - 1][0] + triangle[i][j];
continue;
}
if (j == triangle[i].size() - 1)
{
dp[i][j] = dp[i - 1][j - 1] + triangle[i][j];
continue;
}
dp[i][j] = min(dp[i - 1][j - 1] + triangle[i][j], dp[i - 1][j] + triangle[i][j]);
}
}
int len = triangle[triangle.size() - 1].size();
int m = dp[triangle.size() - 1][0];
for (int i = 1; i < len; i++)
{
m = min(m, dp[triangle.size() - 1][i]);
}
return m;
}