动态规划-矩阵连乘问题(一)

版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/83715706

动态规划的理论性和实践性都比较强,一方面需要理解状态、状态转移、最优子结构、重叠子问题等概念,另一方面又需要根据题目的条件灵活设计算法。

动态规划是一种用途很广的问题求解方法。它本身并不是一个特定的算法,而是一种思想,一种手段。

动态规划算法与分治法类似,其基本思想也是将待求解问题分解为若干个子问题

在分解时,得到的子问题往往不是互相独立的,不同子问题的数目常常只有多项式量级。

在用分治法求解时,有些子问题被重复计算了许多次

如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法

动态规划基本步骤:

1、找出最优解的性质,并刻画其结构特征。

2、递归的定义最优值。

3、以自底向上的方式计算最优值。

4、根据计算最优值时得到的信息,构造最优解。

动态规划算法产用于求解具有某种最优性质的问题。

可能会有许多可行解,希望找到具有最优解的那个解。

矩阵连乘问题

给定n个矩阵, 其中与是可乘的,考察这n个矩阵的连乘积           

计算矩阵的连乘可以有许多不同的计算次序。

输入:矩阵的个数n。矩阵的行数与列数(去除重复)

输出:最少的数乘次数、最优解的方案,即Ai与Aj矩阵相乘,在k位置中断,输出i,k,k+1,j。

计算矩阵的连乘可以有许多不同的计算次序。不同的计算次序对应一种矩阵连乘的完全加括号的方式。

若一个矩阵连乘积的计算次序完全确定,即连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算矩阵连乘积

完全加括号的矩阵连乘递归定义:

(1)单个矩阵是完全加括号的;

(2)矩阵连乘积A是完全加括号的,则A可

       表示为2个完全加括号的矩阵连乘积B 和C  

       的乘积并加括号,即A=(BC)   

给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。

穷举法:列举出所有可能的计算次序,并计算出每一种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。

用这种方法时间复杂度太高了,不采用。

怎么用动态规划的方法来解决这个问题呢?

将矩阵连乘积AiAi+1...Aj简记为A[i:j],这里i <= j

考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,i <=k <=j,则其相应完全加括号方式为

计算量:A[i:k]的计算量加上A[k+1:j]的计算量,再加上A[i:k]和A[k+1:j]相乘的计算量。

动态规划算法的第一步:刻画问题的最优解结构特征。

特征:计算A[i:j]的最优次序所包含的计算矩阵子链A[i:k]和A[k+1:j]的次序也是最优的。

矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。

问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。

步骤二:建立递归关系。

设计算A[i:j],1<=i<=j<=n,所需要的最少数乘次数为m[i,j],则原问题的最优值为m[1,n]

当i=j时,A[i:j]=Aj,因此,m[i,i]=0,i=1,2,...n

当i<j时,假设在k处断开最优,利用最优子结构性质得:

于是可以递归的定义m[i,j]为:

k的位置只有j-i种可能(最后一个在j-1处)。

注意:m[i,j]给出了最优值,同时确定了最优次序中的断开位置k:

m[i,j] =m[i,k] + m[k+1,j]  + pi-1pkpj

若将对应于m[i,j]的断开位置k记为s[i],在计算最优值m[i,j]后, 可由s[i,j]构造出相应的最优解。

步骤三:计算最优值。

i,j可以相等,有n种情况。

由此可见,在递归计算时,许多子问题被重复计算多次。这也是该问题可用动态规划算法求解的又一显著特征

用动态规划算法解此问题,可根据其递归式以自底向上的方式进行计算。

在计算过程中,保存已解决的子问题答案,每个子问题只计算一次。

而在后面需要子问题的解时只要简单的查一下,从而避免大量的重复计算,最终得到多项式时间的算法。

代码实现下一篇再讲。

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/83715706