zoukankan      html  css  js  c++  java
  • 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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Longest Common Subsequence
    D365: WHS APP开发(六)销售发货
    D365: WHS APP开发(五)库存调拨
    D365: WHS APP开发(四)完工入库
    D365: WHS APP开发(三)生产领料
    D365: WHS APP开发(二)采购入库
    D365: WHS APP(一)Mobile连接配置
    D365: Azure Blob Storage(三)文件处理
    D365: Azure Blob Storage(二)认证访问
    D365: Azure Blob Storage(一)创建Blob storage account
  • 原文地址:https://www.cnblogs.com/itdef/p/14985837.html
Copyright © 2011-2022 走看看