给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
思路:
此题与62类似。利用动态规划思想。
用grid[i,j]表示(i,j)位置的网格值。
res[i,j]表示从起点到(i,j)的最小路径和。
递归式为:
r
e
s
[
i
,
j
]
=
{
g
r
i
d
[
i
,
j
]
i
=
=
0
a
n
d
j
=
=
0
r
e
s
[
i
−
1
,
j
]
+
g
r
i
d
[
i
,
j
]
j
=
=
0
r
e
s
[
i
,
j
−
1
]
+
g
r
i
d
[
i
,
j
]
i
=
=
0
m
i
n
(
r
e
s
[
i
−
1
,
j
]
,
r
e
s
[
i
,
j
−
1
]
)
+
g
r
i
d
[
i
,
j
]
i
≠
0
a
n
d
j
≠
0
res[i,j] = \left\{\begin{matrix} grid[i,j] & i == 0 \ and\ j == 0\\ res[i-1,j] + grid[i,j]& j == 0\\ res[i,j-1] + grid[i,j] & i == 0\\ min(res[i-1,j],res[i,j-1]) + grid[i,j] & i \neq 0 \ and\ j \neq 0 & \end{matrix}\right.
res[i,j]=⎩⎪⎪⎨⎪⎪⎧grid[i,j]res[i−1,j]+grid[i,j]res[i,j−1]+grid[i,j]min(res[i−1,j],res[i,j−1])+grid[i,j]i==0 and j==0j==0i==0i̸=0 and j̸=0
class Solution:
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
m,n = len(grid),len(grid[0])
res = [[0]*n for _ in range(m)]
res[0][0] = grid[0][0]
for i in range(1,m):
res[i][0] = res[i-1][0] + grid[i][0]
for j in range(1,n):
res[0][j] = res[0][j-1] + grid[0][j]
for i in range(1,m):
for j in range(1,n):
res[i][j] = grid[i][j] + min(res[i-1][j],res[i][j-1])
return res[m-1][n-1]