LeetCode——triangle 数塔问题

LeetCode——triangle 薯塔 数塔问题

题目描述:

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

LeetCode——triangle 数塔问题_第1张图片
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.
简单翻译一下,给你一个数塔,长成例子给的那样,以二维数组的形式给出。求从第一行到最后一行的最小路经(每个点加起来的值最小)。规则是,例如已经有2->3->5-> ,那么下一步只能走1或者8。这样的路劲有很多条,找出值最小的那条的值。

题目分析:
也许你想用贪心,但是在这里显然是行不通的。
典型的规划动态。以dp[i][j]代表以triangle[i][j]结束的路经的最小值,那么有

dp[i][j]=min((triangle[i][j]+dp[i-1][j]),(triangle[i][j]+dp[i-1][j-1]));

有了这个式子就成功了一大半了,写就完事儿。
注意特殊情况。

AC代码:
自顶向下:

//递推写法,简洁直观  (递归也是可以的)
class Solution {
public:
    int minimumTotal(vector > &triangle) {
        if(triangle.size()==0)
            return 0;
        vector > dp;
        dp.resize(triangle.size());
        dp[0].push_back(triangle[0][0]);//初始化
        for(int i=1;i!=dp.size();i++)
         {
           for(int j=0;j!=triangle[i].size();j++)
           {
               dp[i].resize(triangle[i].size());
               if(j==0)
                 dp[i][j]=triangle[i][j]+dp[i-1][j];
               else if(j==triangle[i].size()-1)
                 dp[i][j]=triangle[i][j]+dp[i-1][j-1];
               else
                   dp[i][j]=min((triangle[i][j]+dp[i-1][j]),(triangle[i][j]+dp[i-1][j-1]));                   
           }            
         }
         //这里偷懒直接用函数排序了,其实有点浪费
        sort(dp[dp.size()-1].begin(),dp[dp.size()-1].end());
        return *(dp[dp.size()-1].begin());//返回最小值
    }
};

自底向上:
参考了牛客用户王大爷的解答,很,评论里好多说人家有错误的,自己欣赏不来╭(╯^╰)╮
还是要多向大神学习呀 fighting ~!!

class Solution {
public:
int minimumTotal(vector > &triangle) {
        vector res(triangle.back());
        for(int i=triangle.size()-2;i>=0;--i)
        {
            for(int j=0;j

你可能感兴趣的:(程序媛养成计划,LeetCode)