931. Minimum Falling Path Sum(DP,亦可暴力)

Given a square array of integers A, we want the minimum sum of a falling path through A.

A falling path starts at any element in the first row, and chooses one element from each row.  The next row's choice must be in a column that is different from the previous row's column by at most one.

 

Example 1:

Input: [[1,2,3],[4,5,6],[7,8,9]]
Output: 12
Explanation: 
The possible falling paths are:
  • [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]

The falling path with the smallest sum is [1,4,7], so the answer is 12

思路:分三种情况吧,在最左边、最右边和中间位置,比较与上一行的相邻列的路径最小位置,然后加上该位置的原始值,更新到达该位置的最短路径长度。在最后一行选出最小的那个dp值即可。

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& A) {
        int n = A.size();
        int dp[n][n];
        //Runtime: 16 ms, faster than 57.82% of C++ online submissions for Minimum Falling Path Sum.
        //Memory Usage: 9.6 MB, less than 91.90% of C++ online submissions for Minimum Falling Path Sum.
        
        //vector<vector<int> >dp(n,vector<int>(n));
        //Runtime: 12 ms, faster than 91.40% of C++ online submissions for Minimum Falling Path Sum.
        //Memory Usage: 10 MB, less than 34.20% of C++ online submissions for Minimum Falling Path Sum
        for(int i=0;i<n;i++) dp[0][i]=A[0][i];
        for(int i=1;i<n;i++){
            for(int j=0;j<n;j++){
                if(j==0){
                    dp[i][j] = A[i][j] + min(dp[i-1][j],dp[i-1][j+1]);
                }else if(j==(n-1)){
                    dp[i][j] = A[i][j] + min(dp[i-1][j],dp[i-1][j-1]);
                }else{
                    dp[i][j] = A[i][j] + min(dp[i-1][j],min(dp[i-1][j-1],dp[i-1][j+1]));
                }
            }
        }
        int smallest=0x3f3f3f3f;
        for(int i=0;i<n;i++){
            if(smallest>dp[n-1][i])
                smallest=dp[n-1][i];
        }
        return smallest; 
    }
};

有趣的是:使用   int dp[n][n];  和   vector<vector<int> >dp(n,vector<int>(n));  对dp初始化的时间、空间效率竟然相差这么大!

目前还不知道究竟是何种原因,如果有知道的大佬还请说一下噢 #^_^#

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章