0
点赞
收藏
分享

微信扫一扫

931 下降路径最小和 Medium

Problem: 931. 下降路径最小和

解题方法

$dp[i][j]$ 表示下降到第$i$行第$j$列的最小和。 因此,只存在三种转移 左上角:$dp[i][j]=dp[i-1][j-1] + matrix[i][j]$ 正上方:$dp[i][j]=dp[i-1][j] + matrix[i][j]$ 右上角:$dp[i][j]=dp[i-1][j+1] + matrix[i][j]$ 取其中最小值即可

复杂度

  • 时间复杂度: $O(n^2)$

  • 空间复杂度: $O(n^2)$

Code

Python

class Solution:
    def minFallingPathSum(self, matrix: List[List[int]]) -> int:
        # 动态规划
        # dp[i][j] 表示下降到第i行第j列的最小和
        n = len(matrix)
        dp = [[math.inf] * n for _ in range(n)]
        for i in range(n):
            # i 表示行
            if i == 0:
                for j in range(n):
                    dp[i][j] = matrix[i][j]
            else:
                # 三个转移
                # 左上角的转移,正上方的转移,和右上角的转移
                # 取最小值
                for j in range(n):
                    if j == 0:
                        dp[i][j] = matrix[i][j] + min(dp[i - 1][j], dp[i - 1][j + 1])
                    elif j == n - 1:
                        dp[i][j] = matrix[i][j] + min(dp[i - 1][j - 1], dp[i - 1][j])
                    else:
                        dp[i][j]= matrix[i][j] + min(dp[i - 1][j - 1], dp[i - 1][j], dp[i - 1][j + 1])
        return min(dp[n - 1])

Java

class Solution {
    public int minFallingPathSum(int[][] matrix) {
        //  创建dp数组
        // dp[i][j] 表示下降到第i行第j列时的最小和
        int n = matrix[0].length;
        int[][] dp = new int[n][n];
        for(int i = 0; i < n; i++){
            if(i == 0){
                for(int j = 0; j < n; j++){
                    dp[i][j] = matrix[i][j];
                }
            }
            else{
                for(int j = 0; j < n; j++){
                    dp[i][j] = dp[i - 1][j] + matrix[i][j];
                    if(j > 0){
                        dp[i][j] = Math.min(dp[i][j], dp[i - 1][j - 1] + matrix[i][j]);
                    }
                    if(j < n - 1){
                        dp[i][j] = Math.min(dp[i][j], dp[i - 1][j + 1] + matrix[i][j]);
                    }
                }
            }
        }
        int ans = dp[n - 1][0];
        for(int i = 0; i < n; i++){
            ans = Math.min(ans, dp[n - 1][i]);
        }
        return ans;
    }
}
举报

相关推荐

0 条评论