动态规划-矩阵最短路径
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划-矩阵最短路径相关的知识,希望对你有一定的参考价值。
#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
‘‘‘
以上是关于动态规划-矩阵最短路径的主要内容,如果未能解决你的问题,请参考以下文章