动态规划问题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为矩阵的大小
显然(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为矩阵的大小