原题地址:https://leetcode-cn.com/problems/minimum-falling-path-sum/submissions/
题目描述:
给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和。
下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。
示例:
输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:12
解释:
可能的下降路径有:
[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]
和最小的下降路径是 [1,4,7],所以答案是 12。
提示:
1 <= A.length == A[0].length <= 100
-100 <= A[i][j] <= 100
解题方案:
思路和三角形最小路径和差不多,但是这个也不是最优解法...就是到[i, j]这个位置时判断它上面三个路径哪个最小,如果是两边就只需要判断两个位置。
代码:
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& A) {
vector<vector<int>> dp;
int m = A.size();
if(m == 0)
return 0;
int n = A[0].size();
dp.resize(m);
for(int i = 0; i < m; i ++)
dp[i].resize(n);
for(int j = 0; j < n; j ++)
dp[0][j] = A[0][j];
for(int i = 1; i < m; i ++)
for(int j = 0; j < n; j ++)
{
int min_sum = dp[i - 1][j];
int tmp = j;
if(j - 1 >= 0)
min_sum = min_sum < dp[i - 1][j - 1] ? min_sum : dp[i - 1][j - 1];
if(j + 1 <= n - 1)
min_sum = min_sum < dp[i - 1][j + 1] ? min_sum : dp[i - 1][j + 1];
dp[i][j] = min_sum + A[i][j];
}
int re = dp[m - 1][0];
for(int j = 1; j < n; j ++)
{
if(dp[m - 1][j] < re)
re = dp[m - 1][j];
}
return re;
}
};