动态规划-矩阵最短路径

#encoding:utf-8
_author_ = "Wang Wenchao"
'''给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,
路径上的所有数字累加起来就是路径和,返回所有的路径中最小的路径和
举例:m
1   3   5   9
8   1   3   4
5   0   6   1
8   8   4   0
路径1,3,1,0,6,1,0是所有路径中路径和最小的,所以返回12
'''[0]
#思路,建立同样大小的二维数组,初始化第一行和第一列,因为其路径唯一
def minPath(arr):
    m,n=len(arr[0]),len(arr)#m列,n行
    dp=[[0]*m for i in range(n)]
    dp[0][0]=arr[0][0]
    for i in range(1,n):
        dp[i][0]=dp[i-1][0]+arr[i][0]
    for j in range(1,m):
        dp[0][j]=dp[0][j-1]+arr[0][j]
    for i in range(1,n):
        for j in range(1,m):
            dp[i][j]=min(dp[i-1][j],dp[i][j-1])+arr[i][j]
    return dp[n-1][m-1]
arr=[[1,3,5,9],[8,1,3,4],[5,0,6,1],[8,8,4,0]]
print minPath(arr)
'''
[1, 4, 9, 18]
[9, 5, 8, 12]
[14, 5, 11, 12]
[22, 13, 15, 12]
12
'''

空间压缩
#
encoding:utf-8 _author_ = "Wang Wenchao" #因为每到一行时只会用到之前的一行,其他已经算出来的没有用处了,滚动更新 def minPath(arr): m,n=len(arr[0]),len(arr)#m列,n行 dp=[0]*m#当然可以选m和n最小值,这里取列数 dp[0]=arr[0][0] for j in range(1,m): dp[j]=dp[j-1]+arr[0][j] for i in range(1,n): dp[0]=dp[0]+arr[i][0] for j in range(1,m): dp[j]=min(dp[j-1],dp[j])+arr[i][j] return dp[m-1] arr=[[1,3,5,9],[8,1,3,4],[5,0,6,1],[8,8,4,0]] print minPath(arr) ''' [1, 4, 9, 18] [9, 5, 8, 12] [14, 5, 11, 12] [22, 13, 15, 12] 12 '''
 
  

 

 

转载于:https://www.cnblogs.com/BetterThanEver_Victor/p/7583316.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值