C ++中的最小下降路径总和II

假设我们有一个网格arr,这是一个正方形网格,具有非零偏移的下降路径是从arr的每一行中选择一个元素,这样在同一列中就不会出现在相邻行中选择的两个元素。我们必须找到非零位移的下降路径的最小和。

因此,如果输入像arr像[[1,2,3],[4,5,6],[7,8,9]],那么输出将为13,因为存在不同的下降路径,这些就像[1,5,9],[1,5,7],[1,6,7],[1,6,8],[2,4,8],[2,4,9] ,[2,6,7],[2,6,8],[3,4,8],[3,4,9],[3,5,7],[3,5,9]。现在,具有最小总和的下降路径为[1,5,7],因此答案为13。

为了解决这个问题,我们将遵循以下步骤-

  • n:=行数,m:=列数

  • 对于初始化i:= 1,当i <n时,更新(将i增加1),-

    • leftVal:=(如果(j-1)> = 0,则为leftMin [j-1],否则为1000000)

    • rightVal:=(如果(j + 1)<m,则rightMin [j + 1],否则1000000)

    • arr [i,j]:= arr [i,j] + min(leftVal,rightVal)

    • rightMin [j]:= arr [i-1,j]和rightMin [j + 1]的最小值

    • leftMin [j]:= leftMin [j-1]和arr [i-1,j]的最小值

    • 定义大小为m的leftMin和rightMin数组

    • leftMin [0]:= arr [i-1,0]

    • 对于初始化j:= 1,当j <m时,更新(将j增加1),-

    • rightMin [m-1] = arr [i-1,m-1]

    • 对于初始化j:= m-2,当j> = 0时,更新(将j减1),执行-

    • 对于初始化j:= 0,当j <m时,更新(将j增加1),执行-

    • ans:= inf

    • 对于初始化i:= 0,当i <m时,更新(将i增加1),执行-

      • ans:= ans和arr [n-1,i]的最小值

    • 返回ans

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    int dp[10005][205];
    class Solution {
       public:
       void pre(){
          for(int i = 0; i <= 10000; i++){
             for(int j = 0; j <=204; j++){
                dp[i][j] = -1;
             }
          }
       }
       int minFallingPathSum(vector<vector<int>>& arr) {
          int n = arr.size();
          int m = arr[0].size();
          for (int i = 1; i < n; i++) {
             vector<int> leftMin(m);
             vector<int> rightMin(m);
             leftMin[0] = arr[i - 1][0];
             for (int j = 1; j < m; j++) {
                leftMin[j] = min(leftMin[j - 1], arr[i - 1][j]);
             }
             rightMin[m - 1] = arr[i - 1][m - 1];
             for (int j = m - 2; j >= 0; j--) {
                rightMin[j] = min(arr[i - 1][j], rightMin[j + 1]);
             }
             for (int j = 0; j < m; j++) {
                int leftVal = (j - 1) >= 0 ? leftMin[j - 1] :
                1000000;
                int rightVal = (j + 1) < m ? rightMin[j + 1] :
                1000000;
                arr[i][j] += min(leftVal, rightVal);
             }
          }
          int ans = INT_MAX;
          for (int i = 0; i < m; i++)
          ans = min(ans, arr[n - 1][i]);
          return ans;
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> v = {{1,2,3},{4,5,6},{7,8,9}};
       cout << (ob.minFallingPathSum(v));
    }

    输入值

    {{1,2,3},{4,5,6},{7,8,9}}

    输出结果

    13