120. Triangle

来源:互联网 发布:尚牌安全套怎么样 知乎 编辑:程序博客网 时间:2024/06/10 16:58

这里写图片描述

这道题使用动态规划,开始我是从顶端到底端进行
状态转移方程:
triangle[i][j]=min(triangle[i-1][j-1],triangle[i-1][j])+triangle[i][j];
这样做比较麻烦,等于求出了从顶端到底端每一个点的最小路径和,最后还要从底端中求出最小的值

class Solution {public:    int minimumTotal(vector<vector<int>>& triangle)     {        if(triangle.size()<1)            return 0;        for(int i=1;i<triangle.size();i++)        {            for(int j=0;j<=i;j++)            {                if(j==0)                    triangle[i][j]+=triangle[i-1][j];                else if(j==i)                    triangle[i][j]+=triangle[i-1][j-1];                else                    triangle[i][j]+=min(triangle[i-1][j-1],triangle[i-1][j]);            }        }        int min_value=triangle[triangle.size()-1][0];        for(int i=1;i<triangle.size();i++)            if(triangle[triangle.size()-1][i]<min_value)                min_value=triangle[triangle.size()-1][i];        return min_value;    }};

第二种方法:从低端到顶端求最小路径,这样顶端的值就是最小路径和
状态方程:
triangle[i][j] += min(triangle[i + 1][j], triangle[i + 1][j + 1])

class Solution {public:    int minimumTotal(vector<vector<int>>& triangle)     {        int n=triangle.size();        if(n<1)            return 0;        //if(n==1)        //  return triangle[0][0];        for(int i=n-2;i>=0;i--)        {            for(int j=0;j<=i;j++)            {                triangle[i][j]+=min(triangle[i+1][j+1],triangle[i+1][j]);            }        }        return triangle[0][0];    }};
0 0
原创粉丝点击