dp-最优矩阵链乘

来自于紫书

题目大意

有\(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

时间: 2024-10-11 15:35:40

dp-最优矩阵链乘的相关文章

POJ1651:Multiplication Puzzle(区间DP 最优矩阵链乘)

题意:除了头尾不能动,每次取出一个数字,这个数字与左右相邻数字的乘积为其价值,最后将所有价值加起来,要求最小值 和最优矩阵链乘模型一样,最后取出的数决定了序,如果没学过最优矩阵连乘找重复子问题还是比较难找的 DP //180K 0MS #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int dp[110][110];

uva348 最优矩阵链乘 经典区间dp

// uva348 最优矩阵链乘 // 典型的区间dp // dp[i][j] 表示矩阵i到j链乘所得到的最小花费 // dp[i][j] = min(dp[i][k]+dp[k+1][j]+a[i].pl*a[k].pr*a[j].pr); // 在区间i到j上找一个k使得dp[i][k]+dp[k+1][j]这两部分的和在加上最后的 // a[i].pl*a[k].pr*p[i].pr的最小值; // 能有这样的状态关键是; P =A[1] * A[2] * .... * A[K] // 和

uva348Optimal Array Multiplication Sequence (最优矩阵链乘+路径输出)

Optimal Array Multiplication Sequence Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Practice UVA 348 Appoint description: Description Download as PDF Given two arrays A and B, we can determine the array C = AB using the

最优矩阵链乘

主要大区间化为小区间…… 先小区间求值…… 状态转移方程 f(i,j) = min{ f(i,k) + f(k+1,j) + p[i-1]p[k]p[j] }; poj 1651 http://poj.org/problem?id=1651 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include

UVA 348 Optimal Array Multiplication Sequence(最优矩阵链乘)

L - Optimal Array Multiplication Sequence Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 348 Appoint description:  acmparand  (2013-08-02)System Crawler  (2015-08-04) Description Given two arrays A a

UVA 348 &amp; ZOJ 1276 Optimal Array Multiplication Sequence(dp , 矩阵链相乘问题)

Optimal Array Multiplication Sequence Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Given two arrays A and B, we can determine the array C = AB using the standard definition of matrix multiplication: The number of

Uva 10003 Cutting Sticks (类似于最优矩阵连乘的dp)

题意:有一根长度为L的木棍,和n个切割点的位置(按照从小到大排序),你的任务是在这些切割点的位置把棍子切成n+1份,使得总切割费用最小.每次切割的费用等于被切的木棍长度 思路:这道题与最优矩阵连乘的思想一样,那就是分析最优子结构,再根据子结构来定义状态,首先我们假定第一次分割的最优方案是在k处分割,得到0~k与k~L两段木棍,那么如何最优分割0~k与0~L就是它的子问题,我们根据子问题定义状态d(i,j)是分割从割点i到割点j的最优方案,状态转移方程 d(i,j)=min{d(i,k)+d(k,

[动态规划] 矩阵链乘法问题

什么是矩阵链乘法(Matrix Chain Multiplication) 矩阵链乘法问题是指给定一串矩阵序列M?M2..Mn,求至少需要进行多少次乘法运算才能求得结果 比如对于这个M?M?M?的矩阵链, 我们可以先计算M?M?然后结果乘以M?,也可以M?M?先算,然后乘以M?,为了表达方便,可以用括号表示计算顺序. 矩阵链M?M?M?有两种计算顺序:((M?M?)M?)和(M?(M?M?)). 那么不同计算顺序有什么区别? 对于((M?M?)M?): 对于(M?(M?M?)):  我们要做的就

动态规划之矩阵链乘法

矩阵链相乘 矩阵链乘法 求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积 A1A2...An ?两个矩阵A和B只有相容(compatible),即A的列数等于B的行数时,才能相乘.如果A是p×q的矩阵,B是q×r的矩阵,那么乘积C是p×r的矩阵.计算C所需要时间由第8行的标量乘法的次数决定的,即pqr. ? ?以矩阵链<A1,A2,A3>为例,来说明不同的加括号方式会导致不同的计算代价.假设三个矩阵的