来自于紫书
题目大意
有\(n\)个矩阵组成的序列,设计一种运算顺序把它们依次乘起来,使得总运算量最小。假设第i个矩阵\(A_i\)是\(P_{i-1} \times P_i\)的。(\(n<=100\))
例如:假设\(A\)、\(B\)、\(C\)分别是\(1 \times 50 , 50 \times 20 , 20 \times 5\)
\(A \times (B \times C)\)的运算量为\(1 \times 50 \times 5 + (50 \times 20 \times 5) = 5250\)
\((A \times B) \times C\)的运算量为\((1 \times 50 \times 20) + 1 \times 20 \times 5 = 1100\)
显然后者更优
解法
最后一次乘时整个矩阵序列一定是被分成两半,假设分界点是\(k\)
即\(L = A_1 \times A_2 \times ... \times A_k\),\(R = A_{k+1} \times A_{k+1} \times ... \times A_n\)
无论\(L\)和\(R\)的内部怎样乘,最后\(L \times R\)的运算量都是不变的
故可以让\(L\)和\(R\)按各自最优方案计算,最后再加上\(L \times R\)的运算量即可
所以可以设\(f(i,j)\)表示第\(i\)个矩阵到第\(j\)个矩阵乘起来所需的最少的运算量,转移方程为:
\(f(i,j) = min\{ f(i,k) + f(k+1,j) + P_{i-1} \times P_k \times P_j \} \ ( i <= k < j)\)
边界\(f(i,i) = 0\),因为转移方程中\(k >= i\),\(k < j\),所以\(dp\)的顺序为\(i\)递减,\(j\)递增
模板题:Poj-1651 Multiplication Puzzle
如果没看过矩阵链乘题目的话,估计一时半会还想不出这道题
原文地址:https://www.cnblogs.com/smsylby/p/12003936.html