这道题也是得从终点往前进行dp的,每次决定当前位置到终点的最小路径和
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示从位置
(
i
,
j
)
(i,j)
(i,j)到终点的最小路径和,状态转移方程为:
d
p
[
i
]
[
j
]
=
m
i
n
(
d
p
[
i
+
1
]
[
j
]
,
d
p
[
i
]
[
j
+
1
]
)
+
d
p
[
i
]
[
j
]
dp[i][j]=min(dp[i+1][j], dp[i][j+1])+dp[i][j]
dp[i][j]=min(dp[i+1][j],dp[i][j+1])+dp[i][j]
- 这里要注意 i + 1 i+1 i+1和 j + 1 j+1 j+1不能越界,所以需要对越界进行判断
初始化为:
d
p
[
m
−
1
]
[
n
−
1
]
=
g
r
i
d
[
m
−
1
]
[
n
−
1
]
dp[m-1][n-1]=grid[m-1][n-1]
dp[m−1][n−1]=grid[m−1][n−1]
具体代码如下:
class Solution(object):
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
if len(grid) == 0:
return 0
m = len(grid)
n = len(grid[0])
dp = np.zeros((m, n))
for i in range(m-1, -1, -1):
for j in range(n-1, -1, -1):
if i + 1 >= m and j + 1 >= n: # 初始化
dp[m-1][n-1] = grid[m-1][n-1]
continue
# 必有一个没有越界
if i + 1 >= m: # 如果向下走越界了,则从当前位置只能向右走
dp[i][j] = dp[i][j+1] + grid[i][j]
continue
if j + 1 >= n: # 如果向右走越界了,则从当前位置只能向下走
dp[i][j] = dp[i+1][j] + grid[i][j]
continue
dp[i][j] = min(dp[i][j+1], dp[i+1][j]) + grid[i][j]
return int(dp[0][0])
solution = Solution()
print(solution.minPathSum([
[1,3,1],
[1,5,1],
[4,2,1]
]))