LeetCode931-下降路径最小和

题目链接

英文链接:https://leetcode.com/problems/minimum-falling-path-sum/

中文链接:https://leetcode-cn.com/problems/minimum-falling-path-sum/

题目详述

给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和。

下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。

示例:

1
2
3
4
输入:[[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
2
1 <= A.length == A[0].length <= 100
-100 <= A[i][j] <= 100

题目详解

动态规划。从上往下走,当前网格 (i, j) 可能来自 (i - 1, j)(i - 1, j - 1)(i - 1, j + 1),取三者最小值。据此可以确定状态转移方程,注意边界判断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class LeetCode_00931 {

public int minFallingPathSum(int[][] A) {
int m = A.length, n = A[0].length;
for (int i = 1; i < m; ++i) {
for (int j = 0; j < n; ++j) {
int min = A[i - 1][j];
if (j > 0) min = Math.min(min, A[i - 1][j - 1]);
if (j < n - 1) min = Math.min(min, A[i - 1][j + 1]);
A[i][j] += min;
}
}
return Arrays.stream(A[m - 1]).min().getAsInt();
}
}