• Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划)


    Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划)

    题目描述

    已知一个正方形二维数组A,我们想找到一条最小下降路径的和

    所谓下降路径是指,从一行到下一行,只能选择间距不超过1的列(也就是说第一行的第一列,只能选择第二行的第一列和第二列;第二行的第二列,只能选择第三行的第一列第二列第三列),最小下降路径就是这个路径的和最小

    测试样例

    Input: [[1,2,3],[4,5,6],[7,8,9]]
    Output: 12
    
    Explanation: 
    可能的下降路径是:
    [1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9]
    [2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9], [2,6,8], [2,6,9]
    [3,5,7], [3,5,8], [3,5,9], [3,6,8], [3,6,9]
    最小下降路径是 [1,4,7], 所以答案是12.
    

    详细分析

    随便举个例子:
    | 1 | 2 | 3 |
    | 4 | 5 | 6 |
    | 7 | 8 | 9 |
    考虑(1,0)这个格子(4)

    • (1,0)有dp[1][0] = 4 + min(1,2)
    • (1,1)有dp[1][1] = 5 + min(1,2,3)
    • (1,2)有dp[1][2] = 6 + min(2,3)

    总结规律即可

    算法实现

    class Solution {
    public:
        int minFallingPathSum(vector<vector<int>>& A) {
            int dp[200][200]={0};
            for(int i=0;i<A.size();i++){
                dp[0][i]=A[0][i];
            }
            
            for(int i=1;i<A.size();i++){
                for(int k=0;k<A[0].size();k++){
                    if(k==0){
                        dp[i][k] = A[i][k]+ min(dp[i-1][k],dp[i-1][k+1]); 
                    }else if(k==A.size()-1){
                        dp[i][k] = A[i][k]+ min(dp[i-1][k],dp[i-1][k-1]);
                    }else{
                        dp[i][k] = A[i][k]+ min(dp[i-1][k],min(dp[i-1][k-1],dp[i-1][k+1]));
                    }
                }
            }
            
            return *min_element(&dp[A.size()-1][0],&dp[A.size()-1][A.size()]);
        }
    };
    
  • 相关阅读:
    MySQL复制的管理和维护
    error nr.1045 access denied for user 'root'@'localhost' (using passwd:no)
    MYSQL-使用mysqldump创建数据库快照
    ConcurrentBag同线程元素的添加和删除
    bootstrap源码学习与示例:bootstrap-tab
    Docker 私有仓库最简便的搭建方法
    使用Apache Jmeter进行并发压力测试
    cmd隐藏指定文件
    Bootstrap之BootstrapDialog
    全栈工程师的武器——MEAN(转)
  • 原文地址:https://www.cnblogs.com/ysherlock/p/9905941.html
Copyright © 2020-2023  润新知