假设我们有一个网格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