这道题也是得从终点往前进行dp的,每次决定当前位置到终点的最小路径和
dp[i][j]dp[i][j]dp[i][j]表示从位置(i,j)(i,j)(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]dp[i][j]=min(dp[i+1][j],dp[i][j+1])+dp[i][j]
- 这里要注意i+1i+1i+1和j+1j+1j+1不能越界,所以需要对越界进行判断
初始化为:
dp[m−1][n−1]=grid[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]
]))
本文介绍了一种使用动态规划解决二维网格中从任意点到终点最小路径和的方法。通过逆向从终点开始更新每个点到终点的最短路径,避免了重复计算,提高了算法效率。

101

被折叠的 条评论
为什么被折叠?



