您的位置:首页 > 其它

动态规划问题3-矩阵连乘问题

2017-10-18 16:28 309 查看
A矩阵为a*b维,B矩阵为b*c维,C矩阵为c*m维。

显然(AB)C=A(BC)。

AB)C的计算次数为:a*b*c+a*c*m

A(BC)的计算次数为:b*c*m+a*b*m

显然两次的计算次数是不一样的。

问题:对于如下n个矩阵连乘最小次数是多少?



Am的维数是(m-1)行*m列

对于这类问题一般采用分治方法:

数据结构:m[i,j]表示第i个到第j个矩阵连乘最小次数。

分治方法:



状态转移矩阵:m[i,j] = m[i,k]+m[k+1,j]+p(i-1)*p(k)*p(j)

这里p(i-1)表示Ai的行,p(k)表示Ak的列,p(j)表示Aj的列。

初始值:m[i][j] = 0,当i=j。

 

一般在动态规划问题中有了初始值,有了状态转移方程,算法只要向前推进,结果就能出来,但在这个问题中i在[1,n]变化,j也在[1,n]中变化,正常递推就不好办了,当出现2个变量都在改变时候,我们采取将i与j两变量的差值进行递推。

i与j相差为0时:比如m[1][1] = 0 ,m[2][2] = 0,m[3][3] = 0

i与j相差为1时:比如m[1][2] ,此时k只能取1,则

m[1][2] = m[1][1]+ m[2][2]+p(0)p(1)p(2),p(0)p(1)p(2)是已知的

m[2][3] = m[2][2]+ m[3][3]+p(1)p(2)p(3),p(1)p(2)p(3)是已知的

 

i与j相差为2时:比如m[1][3] ,此时的k能取1和2

当k取1时:

m[1][3] = m[1][1]+ m[2][3]+p(0)p(1)p(3)

当k取2时:

m[1][3] = m[1][2]+ m[3][3]+p(1)p(2)p(3)

比较k种情况下,取最小值

利用2变量的差值进行递推,求出m[1]
即为n个矩阵连乘最小次数。

代码如下:

n为矩阵个数,m为m[i][j]数据结构,s为k在哪个地方进行划分,p为矩阵的大小

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息