zoukankan      html  css  js  c++  java
  • 【medium】120. 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

    [
         [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.

     
    从两个角度来解题:
    (1)top bottom (memorization)
     
    class Solution {
    private:
        int minimum(vector<vector<int>>& triangle, vector<vector<int>>& dp, int i, int j){
         // 1.边界
    if (i == triangle.size()-1){ dp[i][j] = triangle[i][j]; return triangle[i][j]; } // 2.如果cached if (dp[i][j] != INT_MAX) return dp[i][j]; // 3.递推公式 dp[i][j] = triangle[i][j] + min({minimum(triangle, dp, i+1, j), minimum(triangle, dp, i+1, j+1)}); return dp[i][j]; } public: int minimumTotal(vector<vector<int>>& triangle) { vector<vector<int>> dp; // 1.记忆数组
         //2.记忆数组初始化 dp.resize(triangle.size());
    //r行 for (int k = 0; k < triangle.size(); k++){ dp[k].resize(triangle.size());//每行为c列 } for (int i=0; i<triangle.size(); i++){ for (int j=0; j<triangle.size(); j++) dp[i][j] = INT_MAX; }    //3. solution函数 minimum(triangle, dp, 0, 0); return dp[0][0]; } };
      (2) bottom up (tabulation) --- 更加简单直观
     
    class Solution{
    public:
        int minimumTotal(vector<vector<int>>& triangle) {
            if (triangle.size() == 1)
                return triangle[0][0];
            
            vector<vector<int>> dp;
            dp.resize(triangle.size());//r行
            for (int k = 0; k < triangle.size(); k++){
               dp[k].resize(triangle.size());//每行为c列
            }
            
            for (int i=triangle.size()-1; i>=0; i--)
                dp[triangle.size()-1][i] = triangle[triangle.size()-1][i];
            
            for (int i=triangle.size()-2; i>=0; i--){
                for (int j=0; j<=i; j++)
                    dp[i][j] = triangle[i][j] + min({dp[i+1][j], dp[i+1][j+1]});
            }
            
            return dp[0][0];
        }
    };
     
  • 相关阅读:
    ubuntu sudo apt-get update 失败 解决方法
    Table 'performance_schema.session_variables' doesn't exist
    进程间的几种通信方式
    linux优先级、性能监控指令
    chmod修改文件的权限/chown修改文件和目录的所有者
    Akka学习博客
    RFID Hacking③:使用ProxMark3嗅探银行闪付卡信息
    技术分享:逆向破解华为路由器第二部分
    玩转无线电 -- 温哥华天车 RFID 票务系统
    自己搭建Wifi Pineapple Mark V
  • 原文地址:https://www.cnblogs.com/sherry-yang/p/11432897.html
Copyright © 2011-2022 走看看