给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
思路
定义数组元素dp[i][j]的含义:dp[i][j]代表行i列j的网格的最小路径和
定义数组元素之间的状态转移方程:dp[i][j] = min{dp[i-1][j], dp[i][j-1]} + a[i][j]
定义数组元素的初始值:dp的第一行的路径和,dp的第一列的路径和
grid
| 1 | 3 | 1 |
|---|---|---|
| 1 | 5 | 1 |
| 4 | 2 | 1 |
dp
| 1 | 4 | 5 |
|---|---|---|
| 2 | 7 | 6 |
| 6 | 8 | 7 |
| 1 | 4 | 10 |
class Solution:
def minPathSum(self, grid):
m, n = len(grid), len(grid[0])
if m == 0 or n == 0:
return 0
dp = [[0 for i in range(n)] for i 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 i in range(1, n):
dp[0][i] = dp[0][i-1] + grid[0][i]
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[m-1][n-1]
# 测试用例
grid = [
[1,3,1],
[1,5,1],
[4,2,1]
]
solution = Solution()
solution.minPathSum(grid)