[leetcode DP]64. Minimum Path Sum

最短路径算法
本文介绍了一个m*n表格中从左上角到右下角的最短路径求解方法,使用动态规划实现,并提供了两种实现方式:一种是占用二维空间的方式,另一种是优化后的线性空间占用方式。

一个m*n的表格,每个格子有一个非负数,求从左上到右下最短的路径值

和62,63两个值是同一个思路,建立dp表,记录每个位置到右下角的最短路径的值

 1 class Solution(object):
 2     def minPathSum(self, grid):
 3         m,n = len(grid),len(grid[0])
 4         flag = [[0 for i in range(n)] for j in range(m)]
 5         flag[m-1][n-1] = grid[m-1][n-1]
 6         for i in range(m-1,-1,-1):
 7             for j in range(n-1,-1,-1):
 8                 if i==m-1:
 9                     if j!=n-1:
10                         flag[i][j] = grid[i][j] + flag[i][j+1]
11                 elif j==n-1:
12                     if i!=m-1:
13                         flag[i][j] = grid[i][j] + flag[i+1][j]
14                 else:
15                     flag[i][j] = min(flag[i+1][j],flag[i][j+1])+grid[i][j]
16         return flag[0][0]

 

 占用线性空间的解法:

 1 class Solution(object):
 2     def minPathSum(self, grid):
 3         m,n = len(grid),len(grid[0])
 4         flag = [0]+[sys.maxint]*(n-1)
 5         for i in range(m):
 6             flag[0] += grid[i][0]
 7             for j in range(1,n):
 8                 flag[j] = min(flag[j],flag[j-1]) +  grid[i][j]
 9         return flag[-1]
10         

 

转载于:https://www.cnblogs.com/fcyworld/p/6539741.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值