Triangle

来源:互联网 发布:什么是软件质量管理 编辑:程序博客网 时间:2024/05/27 03:30

题目描述:

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;}


0 0
原创粉丝点击