[Leetcode]931.下降路徑最小和

AdamWong發表於2019-01-01

題目連結

這一題目首先需要弄懂題目的意思,下降路徑最小和指的是在方陣中可以從上往下行走,走過後獲得的值最小,方向可以是走左下,右下,直下。

題目和傳統的動態規劃一樣,把邊界的值先初始化,然後通過狀態轉移一步一步到最後一行

我們有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()即可。

 

相關文章