求解矩阵最小路径和问题。给定一个m行n列的矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有数字累加起来作为这条路径的路径和。编写一个程序求所有路径和中的最小路径和。
时间: 2024-02-22 20:58:07 浏览: 75
给定一个包含非负整数的M x N网格,请找出一条从左上角到右下角的路径,使得路径的数字总和最小,并显示其路径。
5星 · 资源好评率100%
这是一个典型的动态规划问题。我们可以定义一个二维数组dp[m][n],其中dp[i][j]表示从左上角到达位置(i,j)的最小路径和。那么状态转移方程为:
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j]
其中,matrix[i][j]表示矩阵中位置(i,j)的数字。边界条件为dp[0][0] = matrix[0][0],dp[i][0] = dp[i-1][0] + matrix[i][0],dp[0][j] = dp[0][j-1] + matrix[0][j]。
最终的答案为dp[m-1][n-1]。下面是一份Python代码实现:
```python
def minPathSum(matrix):
m, n = len(matrix), len(matrix[0])
dp = [[0] * n for _ in range(m)]
dp[0][0] = matrix[0][0]
# 初始化第一行和第一列
for i in range(1, m):
dp[i][0] = dp[i-1][0] + matrix[i][0]
for j in range(1, n):
dp[0][j] = dp[0][j-1] + matrix[0][j]
# 动态规划
for i in range(1, m):
for j in range(1, n):
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j]
return dp[m-1][n-1]
```
时间复杂度为O(mn),空间复杂度为O(mn),可以通过LeetCode上的测试。
阅读全文