动态规划-矩阵最短路径

#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