算法题05:动态规划:求矩阵链乘的最优次序、两字符串的最长公共子串

一、用动态规划方法寻找矩阵链 A 1 × A 2 × A 3 × A 4 A_1\times A_2 \times A_3 \times A_4 A1×A2×A3×A4的最佳乘法结合顺序使得调用的标量乘法次数最小 ,写出计算过程。
A 1 A 2 A 3 A 4 矩 阵 大 小 3 × 5 5 × 10 10 × 2 2 × 4 \begin{array}{|c|c|c|c|c|} \hline & A_1 & A_2 & A_3 & A_4 \\ \hline 矩阵大小 & 3\times 5 & 5\times 10 & 10 \times2 & 2\times 4 \\ \hline \end{array} A13×5A25×10A310×2A42×4

解:

m [ i , j ] m[i,j] m[i,j]表示设计算 A [ i : j ] A[i:j] A[i:j]所需最少数乘次数,有递归表示为

m [ i , j ] = { 0 i = j min ⁡ i ≤ k < j { m [ i , k ] + m [ k + 1 , j ] + p i − 1 p k p j } i < j m[i, j]=\left\{\begin{array}{cc}0 & i=j \\ \min _{i \leq k<j}\left\{m[i, k]+m[k+1, j]+p_{i-1} p_{k} p_{j}\right\} & i<j\end{array}\right. m[i,j]={0minik<j{m[i,k]+m[k+1,j]+pi1pkpj}i=ji<j

1234
10A1A2min{ A1(A2A3),(A1A2)A3 }min{ A1(A2A3A4)
(A1A2)(A3A4)
(A1A2A3)A4 }
20A2A3min{ A2(A3A4),(A2A3)A4 }
30A3A4
40

m [ 1 , 2 ] = A 1 A 2 = 3 ∗ 5 ∗ 10 = 150 m[1,2] = A_1 A_2 = 3*5*10 = 150 m[1,2]=A1A2=3510=150 结果矩阵规模:3*10

m [ 2 , 3 ] = A 2 A 3 = 5 ∗ 10 ∗ 2 = 100 m[2,3] = A_2 A_3 = 5*10*2 = 100 m[2,3]=A2A3=5102=100 5*2

m [ 3 , 4 ] = A 3 A 4 = 10 ∗ 2 ∗ 4 = 80 m[3,4] = A_3 A_4 = 10*2*4 = 80 m[3,4]=A3A4=1024=80 10*4

m [ 1 , 3 ] = m i n { A 1 ( A 2   A   3   ) , ( A 1 A 2   ) A   3   } m[1,3] = min\{A_1(A_2~A~3~),(A_1 A_2~)A~_3~\} m[1,3]=min{A1(A2 A 3 )(A1A2 )A 3 }
A1(A2A3) = m [ 2 , 3 ] m[2,3] m[2,3] + 3*5*2 = 130 结果矩阵规模:3*2

​ (A1A2)A3 = m [ 1 , 2 ] m[1,2] m[1,2] + 3 * 10 *2 = 210 3*2
m [ 1 , 3 ] m[1,3] m[1,3] = A 1 ( A 2   A   3   ) A_1(A_2~A~3~) A1(A2 A 3 ) = 130 3*2

同理有:
m [ 2 , 3 ] = ( A   2   A   3   ) A   4   = 140 m[2,3] =(A~_2~ A~_3~)A~_4~ = 140 m[2,3]=(A 2 A 3 )A 4 =140 5*4

m [ 1 , 4 ] = m i n { A 1 ( A 2 A 3 A 4 ) , ( A 1 A 2 ) ( A 3 A 4 ) , ( A 1 A 2 A 3 ) A 4 } m[1,4] = min\{ A_1(A_2A_3A_4),(A_1A_2)(A_3A_4),(A_1A_2A_3)A_4 \} m[1,4]=min{A1(A2A3A4)(A1A2)(A3A4)(A1A2A3)A4}
A 1 ( A 2 A 3 A 4 ) = m [ 2 , 4 ] + 3 ∗ 5 ∗ 4 = 200 A_1(A_2A_3A_4) = m[2,4] + 3*5*4 = 200 A1(A2A3A4)=m[2,4]+354=200
( A 1 A 2 ) ( A 3 A 4 ) = m [ 1 , 2 ] + m [ 3 , 4 ] + 3 ∗ 10 ∗ 4 = 350 (A_1A_2)(A_3A_4) = m[1,2]+m[3,4]+3*10*4 = 350 (A1A2)(A3A4)=m[1,2]+m[3,4]+3104=350
( A 1 A 2 A 3 ) A 4 = m [ 1 , 3 ] + 3 ∗ 2 ∗ 4 = 154 (A_1A_2A_3)A_4 = m[1,3] + 3*2*4 = 154 (A1A2A3)A4=m[1,3]+324=154

m [ 1 , 4 ] = 154 m[1,4] = 154 m[1,4]=154

所以最小乘法次数为 m [ 1 , 4 ] = 154 m[1,4] = 154 m[1,4]=154 次序为 ( A 1 ( A 2 A 3 ) ) A 4 (A_1(A_2A_3))A_4 (A1(A2A3))A4 .

二、用动态规划方法计算字符串 “ A B D B D C B ” “ABDBDCB” ABDBDCB和字符串 “ B D B C A B A ” “BDBCABA” BDBCABA最长公共子串。写出计算过程。

求公共子串方法

​ 把两个字符串分别以行和列组成一个二维矩阵。比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0。

通过查找出值为1的最长对角线就能找到最长公共子串。
在这里插入图片描述
可以得到最长公共子串为 B D B BDB BDB.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值