zoukankan      html  css  js  c++  java
  • [Leetcode]931.下降路径最小和

    题目链接

    这一题目首先需要弄懂题目的意思,下降路径最小和指的是在方阵中可以从上往下行走,走过后获得的值最小,方向可以是走左下,右下,直下。

    题目和传统的动态规划一样,把边界的值先初始化,然后通过状态转移一步一步到最后一行

    我们有dp[i][j]:意思是终点为(i,j)的下降路径最小值

    状态方程为

     dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i-1][j+1])+A[i][j] ;

    分别代表从左上(i-1,j-1),从正上方(i-1,j),从右上方(i-1,j+1)三种情况。求这三种情况的最小值即可。

    答案很明显就是最后一行的最小值了,我们只需要调用STL自带的min_element或者for循环遍历即可找到。

    我提交的代码如下,超越了100%的提交用户

    class Solution {
    public:
        inline int min3(const int a,const int b,const int c){
            int ans=a;
            if(b<ans)ans=b;
            if(c<ans)ans=c;
            return ans;
        }
        int minFallingPathSum(vector<vector<int>>& A) {
          int t = A.size();
          int dp[t][t];
    
          for (int j = 0; j < t; j++) {
            dp[0][j] = A[0][j];
            }
            
            
            
            for (int i = 1; i < t; i++) {
                
                dp[i][0] = min(dp[i-1][0], dp[i-1][1]) + A[i][0];
                dp[i][t - 1] = min(dp[i-1][t - 1], dp[i-1][t-2]) + A[i][t - 1];
                
                int tmp = 0;
                for (int j = 1; j < t - 1; j++) {
                    dp[i][j] = min3(dp[i-1][j + 1], dp[i-1][j-1], dp[i-1][j]) + A[i][j];
                }
            }
            
            return *min_element(dp[t - 1], dp[t-1]+t);
            
        }
    };

    这段代码还做了几个改进,

    1. 是求三个数的最小值时使用了自己编写的而不是algorithm库自带的min(a,min(b,c));减少几次函数调用
    2. 既然已经知道是方阵,我们不需要再去求参数中的A[0].size()了,直接求一个A.size()即可。
  • 相关阅读:
    SocketAsyncEventArgs的释放问题
    SharePoint 2013部署自定义HttpModule访问SPContext.Current的一个问题
    ASP.NET MVC View使用Conditional compilation symbols
    XPath注入
    Java基础(十二)之包和权限访问
    SSI注入漏洞
    java基础(十一)之抽象类和抽象函数
    邮件头注入
    java基础(十)之向上转型/向下转型
    java基础(八)之函数的复写/重写(override)
  • 原文地址:https://www.cnblogs.com/adamwong/p/10205102.html
Copyright © 2011-2022 走看看