#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 ‘‘‘
时间: 2024-11-05 19:01:09