题目分析:
这一题与【LeetCode】62. Unique Paths,【LeetCode】63. Unique Paths II相似度很高,这次是每次走的路径长度给定了,求的是最短路径,可以建立二维dp数组解决,属于较简单的动态规划。其实题目也就是让求有向图的最短路径问题。
解题思路:
我们创建一个与原数组行列相同的dp数组,dp数组从左上更新到右下,过程如图:从左上出发,可以向右或者向下走,故每个点的路径数等于dp数组该位置的值加上原数组该点上面或左面较小的那个值,如图所示过程。(说明:过程并不是按双重循环走的,图示为了方便省略了第一行与第一列的产生方式)在产生第一行(第一列)由于它不能和上面(左面)的比较,故让它和一个较大的数比较,或者单独判断是否为第一行(列)也可以解决。
测试代码:
class Solution:
def minPathSum(self, grid: list):
r_len = len(grid)
c_len = len(grid[0])
dp = [[0] * c_len for i in range(r_len)]
for i in range(r_len):
for j in range(c_len):
if i == j == 0: dp[i][j] = grid[i][j]
else:
y = 2147483647 if i - 1 < 0 else dp[i - 1][j]
x = 2147483647 if j - 1 < 0 else dp[i][j - 1]
dp[i][j] = grid[i][j] + min(x, y)
return dp[-1][-1]
print(Solution().minPathSum([[1, 3, 1],[1, 5, 1],[4, 2, 1]])) #提交时请删除该行