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;}
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- Triangle
- express和body-parser的登录项目
- codevs 1058 合唱队形(DP)
- hdu5938Four Operations
- Android 框架的组成
- UIScrollView配合定时器自动循环滚动
- Triangle
- php中百度编辑器的使用
- 【MySQL】MySQL的数据类型
- 13. Roman to Integer
- IOS开发之UIScrollViewDelegate详解
- 1029. Median (25)
- SmartImageView使用
- linux驱动开发:了解网卡的相关函数和结构
- 文字溢出使用点点点