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
以上是 C ++中的最小下降路径总和II 的全部内容, 来源链接: utcz.com/z/316327.html