zoukankan      html  css  js  c++  java
  • 动态规划-矩阵最短路径

    #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 '''
    
    
    
     
  • 相关阅读:
    K-Means++ 聚类之数据可视化:使用gnuplot
    QQ设计第1-5步
    QQ设计第1-5步
    为什么有很深的windows基础还是不能动摇linux半步
    常用命令
    在线会计_金蝶友商网
    XP使用VNC远程桌面CentOS 6
    Fatal error: Call to undefined function mb_substr()
    如何汉化 po 文件及编译成 mo 文件
    idoerp
  • 原文地址:https://www.cnblogs.com/BetterThanEver_Victor/p/7583316.html
Copyright © 2011-2022 走看看