区间DP 矩阵链的乘法
矩阵相乘
实际上矩阵相乘题是典型的区间动态规划
区间DP的操作如图,区间范围由小到大逐步增加
首先我们来看看动态规划的四个步骤:
- 找出最优解的性质,并且刻画其结构特性;
- 递归的定义最优解;
- 以自底向上的方式刻画最优值;
- 根据计算最优值时候得到的信息,构造最优解
其中改进的动态规划算法:备忘录法,是以自顶向下的方式刻画最优值,对于动态规划方法和备忘录方法,两者的使用情况如下:
一般来讲,当一个问题的所有子问题都至少要解一次时,使用动态规划算法比使用备忘录方法好。此时,动态规划算法没有任何多余的计算。同时,对于许多问题,常常可以利用其规则的表格存取方式,减少动态规划算法的计算时间和空间需求。当子问题空间中的部分子问题可以不必求解时,使用备忘录方法则较为有利,因为从其控制结构可以看出,该方法只解那些确实需要求解的问题。
对于动态规划算法,我们必须明确两个基本要素,这两个要素对于在设计求解具体问题的算法时,是否选择动态规划算法具有指导意义:
- 算法有效性依赖于问题本身所具有的最优子结构性质:设计算法的第一步通常是要刻画最优解的结构。当问题的最优解包含了子问题的最优解时,称该问题具有最优子结构性质。问题的最优子结构性质提供了该问题可以使用动态规划算法求解的重要线索
在矩阵连乘积最优次序问题中注意到,若A1A2…An的最优完全加括号方式在Ak和Ak+1之间断开,则由此可以确定的子链A1A2A3…Ak和Ak+1Ak+2…An的完全加括号方式也最优,即该问题具有最优子结构性质。在分析该问题的最优子结构性质时候,所使用的方法具有普遍性。首先假设由原问题导出的子问题的借不是最优解,然后在设法说明在这个假设下可以构造出比原问题最优解更好的解,从而导致矛盾。
在动态规划算法中,利用问题的最优子结构性质,以自底向上的方式递归的从子问题的最优解逐渐构造出整个问题的最优解。算法考察的子问题的空间规模较小。例如在举证连乘积的最优计算次序问题中,子问题空间由矩阵链的所有不用的子链组成。所有不用的子链的个数为o(n* n),因而子问题的空间规模为o(n* n)
- 可以用动态规划算法求解问题应该具备另一个基本要素是子问题的重叠性。在用递归算法自顶向下求解此问题时候,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题都只是求解一次,而后将其保存到一个表格中,当再次需要解此问题时,只是简单使用常数时间查看一下结果。 通常,不同子问题个数随着问题大小呈多项式增长。因此使用动态规划算法通常只是需要多项式时间,从而获得较高的解题效率。
逐步分析
P=<30,35,15,5,10,20> 它对应5个矩阵
1 | A1:30*35 A2:35*15 A3:15*5 A4:5*10 A5:10*20 |
先计算:
当r=1
表示两个矩阵相乘的运算量
m[1,1]=0 m[2,2]=0 m[3,3]=0 m[4,4]=0 m[5,5]=0
当r=2
表示两个矩阵相乘的运算量
m[1,2]=303515=15750
m[2,3]=35155=2625
m[3,4]=15510=750
m[4,5]=51020=1000
当r=3
表示3个矩阵相乘的运算量
m[1,3]=min{m[1,2]+30155,m[2,3]+30355}=min{15750+2625,2625+5250}=7875 A1(A2A3) s[1,3]=1
m[2,4]=min{m[2,3]+35510,m[3,4]+351510}={2625+1750,750+5250}=4375 (A2A3)A4 s[2,4]=3
m[3,5]=min{m[3,4]+151020,m[4,5]+15520}=2500 A3(A4A5) s[3,5]=3
当r=4
表示4个矩阵相乘的运算量
m[1,4]=min{m[2,4]+303510,m[1,2]+m[3,4]+301510,m[1,3]+30510}
=min{4375+10500,15750+750+4500,7875+1500}
=9375 [A1A2A3]A4—->(A1(A2A3))A4 s[1,4]=3
m[2,5]=min{m[3,5]+351520,m[2,3]+m[4,5]+35520,m[2,4]+351020}
=min{2500+10500,2625+1000+3500,4375+7000}
=7125 (A2A3)(A4A5) s[2,5]=3
当r=5
表示5个矩阵相乘的运算量
m[1,5]=min{m[2,5]+303520,m[1,2]+m[3,5]+301520,m[1,3]+m[4,5]+30520,m[1,4]+301020}
=min{7125+21000,15750+2500+9000,7875+1000+3000,9375+9000}
=11875 [A1A2A3](A4A5)---->(A1(A2A3))
(A4A5) s[1,5]=3
优化函数备忘录:
r=1 m[1,1]=0 m[2,2]=0 m[3,3]=0 m[4,4]=0 m[5,5]=0
r=2 m[1,2]=15750 m[2,3]=2625 m[3,4]=750 m[4,5]=1000
r=3 m[1,3]=7875 m[2,4]=4375 m[3,5]=2500
r=4 m[1,4]=9375 m[2,5]=7125
r=5 m[1,5]=11875
标记函数
r=2 s[1,2]=1 s[2,3]=2 s[3,4]=3 s[4,5]=4
r=3 s[1,3]=1 s[2,4]=3 s[3,5]=3
r=4 s[1,4]=3 s[2,5]=3
r=5 s[1,5]=3
根据 s[1,5]=3
推出最后一次划分的位置为3 [A1A2A3][A4A5]
然后再由[A1A2A3]
找s[1,3]=1
推出最后一次划分位置为1 A1(A2A3)
所以最终答案为:(A1(A2A3))(A4A5)
运算次数为:11875
次
练习:
再将P=<20,70,25,30,5,35,10>计算出来
Java实现
1 | public class Strassen { |
C++实现
1 |
|