• Leetcode 120 三角形最小路径和


    地址 https://leetcode-cn.com/problems/triangle/

    给定一个三角形 triangle ,找出自顶向下的最小路径和。
    每一步只能移动到下一行中相邻的结点上。
    相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。
    也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
    
    示例 1:
    输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
    输出:11
    解释:如下面简图所示:
       2
      3 4
     6 5 7
    4 1 8 3
    自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
    
    示例 2:
    输入:triangle = [[-10]]
    输出:-10
     
    
    提示:
    1 <= triangle.length <= 200
    triangle[0].length == 1
    triangle[i].length == triangle[i - 1].length + 1
    -104 <= triangle[i][j] <= 104
     
    
    进阶:
    你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题吗?
    

    解答
    使用dp动态规划接答
    从上至下 从下至上均可

    三角形数据存储变量为 vector<vector<int>> triangle
    dp存储变量则为 vector<vector<int>> dp
    是计算方向是从上至下 从下至上
    dp[i][j] = max(dp[i-1][j]+dp[i-1][j-1]) + triangle[i][j];
    dp[i][j] = max(dp[i+1][j]+dp[i+1][j+1]) + triangle[i][j];
    

    代码

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

    自底向上代码

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

    我的视频题解空间

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Qt4.7.4下单独编译QtWebkit
    CronHowto Community Ubuntu Documentation
    菜鸟学Python(9):给文件添加内容,得到文件信息
    yet another software souring company based on san franciso
    Get Started With Chickenfoot
    Berkeley DB(四) DB Environment
    搭建SSH框架链接Oracle数据库
    Linux下手动编译安装Apache2.x
    Errore HTTP 404.2 Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理
    关于二分法中取中间值时向下和向上取整的问题(由大白LA3971想到的)
  • 原文地址:https://www.cnblogs.com/itdef/p/14985837.html
Copyright © 2020-2023  润新知