动态规划-矩阵最短路径

#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

动态规划-矩阵最短路径的相关文章

BNUOJ 34985 Elegant String 2014北京邀请赛E题 动态规划 矩阵快速幂

Elegant String Time Limit: 1000msMemory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main We define a kind of strings as elegant string: among all the substrings of an elegant string, none of them is a permutation of "0, 1,-, k

动态规划-矩阵链乘法

问题描述: 给定由n个要相乘的矩阵构成的序列(链)<A1,A2,...,An>,要计算乘积A1A2...An,可以将两个矩阵相乘的标准算法作为一个子程序,通过加括号确定计算的顺序(对同一矩阵链,不同的计算顺序所需要的计算次数大不相同). 目标问题:给定n个矩阵构成的矩阵链<A1,A2,...,An>,其中,i=1,2,...,n,矩阵Ai的维数为pi-1×pi,对乘积A1A2...An以一种最小计算次数加全部括号. 穷尽搜索: 令P(n)表示一串n个矩阵可能的加全部方案数.当n=1

动态规划 矩阵链

算法导论上的题目,用动态规划算法解矩阵链乘法问题需要时间为O(n^3),空间为O(n^2). 问题描述: 给定n个矩阵构成的一个链(A1*A2*A3--*An),其中i=1,2,--n,矩阵Ai的维数为p(i-1)*p(i),对于乘积A1*A2*A3--*An以一种最小化标量乘法次数的方式进行加括号. /************************************************************************* > File Name: maxtrix_ch

算法导论 之 动态规划 - 矩阵链相乘

1 引言 在大学期间,我们学过高等数学中的线性规划,其中有关于矩阵相乘的章节:只有当矩阵A的列数与矩阵B的行数相等时,A×B才有意义.一个m×n的矩阵A(m,n)左乘一个n×p的矩阵B(n,p),会得到一个m×p的矩阵C(m,p).矩阵乘法满足结合律,但不满足交换律. 假设现要计算A×B×C×D的值,因矩阵乘法满足结合律,不满足交换律,即:A.B.C.D相邻成员的相乘顺序不会影响到最终的计算结果,比如: A×(B×(C×D)).A×((B×C)×D).(A×B)×(C×D).A×(B×C)×D.

【C++】 动态规划—矩阵链乘

[本文原创于Paul的博客园技术博客.] [本文欢迎转载,转载请以链接形式注明出处.] [本博客所有文章都经博主精心整理,请尊重我的劳动成果.] [C++] 动态规划-矩阵链乘 1.问题描述 给定n个矩阵构成的一个链给定{A1,A2,-,An},其中i=1,2,...,n.矩阵Ai的维数为pi-1*pi,如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少. 2.最优子结构 对乘积A1A2...An的任意加括号方法都会将序列在某个地方分成两部分,也就是最后一次乘法计算的

Codeforces 506E Mr. Kitayuta&#39;s Gift - 动态规划 - 矩阵

题目传送门 通往Codeforces的航线 通往vjudge的航线 题目大意 给定一个仅包含小写字母的串$s$,要求插入恰好$n$个小写字母字符,使得新串为回文串.问这样得到的新串有多少个是本质不同回文串. $1\leqslant |s| \leqslant 200,1 \leqslant n \leqslant 10^{9} $ 神题orz...orz...orz.Petr orz...orz...orz. 好了开始扯正题了. 任意位置插入并不太好处理.可以转化一下这个问题,求一个长度为$|s

动态规划-矩阵连乘(附备忘录法)

题目:矩阵连乘, 求解计算量最小的加括号方法. 输入: 按顺序输入各个矩阵的 行和列. 求解: 最少数乘次数和加括号方案. (详细情况可自行百度) 题解: 用一个数组p[] 来存储参数, (但要进行处理一下, 如: 矩阵A 为 10*5 , B 为 5*15.P[]只记录 10, 5, 15) 用m[i][j] 来表示 从 i->j 的数乘最小值.s[][]记录过程中的最优步骤. const int maxn = 100; int p[maxn], m[maxn][maxn], s[maxn][

poj 3744 Scout (Another) YYF I - 概率与期望 - 动态规划 - 矩阵快速幂

(Another) YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate into the enemy's base. After overcoming a series difficulties, (Another) YYF is now at the start of enemy's famous "mine road". This is a very long road,

动态规划-矩阵连乘

动态规划四个步骤: 1)描述最优解的结构 2)递归定义最优解的值 3)按自底向上的方式计算最优解的值 4)由计算出的结果构造一个最优解 定义:pi-1表示第i个矩阵的行数,pi表示第i个矩阵的列数   Ai..j表示对乘积AiAi+1...Aj求值的结果 i<j,i<=k<j m[i,j]:表示矩阵Ai..j所需标量乘法运算次数的最小值 矩阵连乘: 1)描述最优解:找到最优子结构 假设最优解把乘积在Ak与Ak+1分开,那么AiAi+1...Ak和Ak+1...Aj的最优解必定是AiAi+