Skip to content

Latest commit

 

History

History
81 lines (57 loc) · 2.42 KB

931-minimum-falling-path-sum.md

File metadata and controls

81 lines (57 loc) · 2.42 KB

931. Minimum Falling Path Sum - 下降路径最小和

给定一个方形整数数组 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. 1 <= A.length == A[0].length <= 100
  2. -100 <= A[i][j] <= 100

题目标签:Dynamic Programming

题目链接:LeetCode / LeetCode中国

题解

类似于动态规划经典的数字三角形的问题。

记C(i, j)为从A(i, j)到最后一层的最小路径和。状态转移方程:

C(i, j) = min{ C(i+1, j-1), C(i+1, j), C(i+1, j+1) } + A(i, j)

对于最后一层,C(i, j) = A(i, j)。

最后求C(0, j)的最小值即可。

Language Runtime Memory
python3 88 ms N/A
class Solution:
    def minFallingPathSum(self, A):
        """
        :type A: List[List[int]]
        :rtype: int
        """
        if not A or not A[0]:
            return 0
        dp = [[0] * len(A[0]) for _ in range(len(A))]
        for j in range(len(A[0])):
            dp[-1][j] = A[-1][j]
        for i in range(len(A)-2, -1, -1):
            for j in range(len(A[0])):
                tmp = dp[i+1][j]
                if j > 0:
                    tmp = min(tmp, dp[i+1][j-1])
                if j < len(A) - 1:
                    tmp = min(tmp, dp[i+1][j+1])
                dp[i][j] = tmp + A[i][j]
        return min(dp[0])