python动态规划最小路径问题
时间: 2024-09-14 18:01:12 浏览: 38
动态规划是解决最优化问题的一种方法,它将复杂问题分解为更小的子问题,并通过解决这些子问题来构建解决方案。在Python中实现动态规划来解决最小路径问题,通常是指在一个网格(二维数组)中找到从左上角到右下角的最小路径和。
最小路径和问题可以用以下方式表述:给定一个包含非负数的 m x n 网格,从左上角开始每次只能向右或向下移动一步,直到到达右下角。现在要求计算从左上角到右下角的最小路径和。
实现步骤如下:
1. 创建一个同样大小的二维数组 dp,dp[i][j] 表示从左上角到网格 (i, j) 的最小路径和。
2. 初始化 dp 数组的第一行和第一列。因为这些位置只能从一个方向到达,所以最小路径和就是它们各自网格的值。
3. 对于 dp 数组中的其他位置,其最小路径和应该是其上方和左方位置的最小路径和的最小值加上当前网格的值。
4. 最终,dp 数组的右下角元素即为所求的最小路径和。
下面是一个 Python 代码示例:
```python
def min_path_sum(grid):
if not grid or not grid[0]:
return 0
m, n = len(grid), len(grid[0])
dp = [[0]*n for _ in range(m)]
# 初始化第一行和第一列
dp[0][0] = grid[0][0]
for i in range(1, m):
dp[i][0] = dp[i-1][0] + grid[i][0]
for j in range(1, n):
dp[0][j] = dp[0][j-1] + grid[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]) + grid[i][j]
return dp[-1][-1]
# 示例网格
grid = [
[1,3,1],
[1,5,1],
[4,2,1]
]
print(min_path_sum(grid)) # 输出应为 7
```
阅读全文