📅  最后修改于: 2023-12-03 15:28:39.861000             🧑  作者: Mango
给定一个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]