📜  门| GATE CS Mock 2018年|问题2(1)

📅  最后修改于: 2023-12-03 15:28:39.861000             🧑  作者: Mango

门| GATE CS Mock 2018年|问题2

题目描述

给定一个nn的矩阵M,请编写一个算法来查找从矩阵的左上角到右下角的最小路径和。你只能向下或向右移动。 例如,给定下面的33矩阵M:

1 3 1
1 5 1
4 2 1

则从左上角到右下角的最小路径和为7,即1+3+1+1+1。

解题思路

这道题可以使用动态规划来解决。定义一个n*n的数组dp,其中dp[i][j]表示从起点到(i,j)位置的最小路径和,则dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + M[i][j]。为了方便计算,我们可以将dp数组初始化为全0,即dp[i][j]=0。(这一步其实是默认起点和dp[0][0]是同一个位置,在实际解题时并不必要。)

代码实现
def minPathSum(M) -> int:
    n = len(M)
    dp = [[0] * n for _ in range(n)]
    dp[0][0] = M[0][0]
    
    for i in range(1,n):
        dp[i][0] = dp[i-1][0] + M[i][0]
    for j in range(1,n):
        dp[0][j] = dp[0][j-1] + M[0][j]
    
    for i in range(1,n):
        for j in range(1,n):
            dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + M[i][j]
    
    return dp[n-1][n-1]
复杂度分析
  • 时间复杂度:$O(n^2)$,需要遍历整个n*n的矩阵。
  • 空间复杂度:$O(n^2)$,需要开辟一个n*n的二维数组dp。