十个利用矩阵乘法解决的经典题目
2x3矩阵乘3x2矩阵例题
2x3矩阵乘3x2矩阵例题本文将介绍2x3矩阵乘3x2矩阵的例题,并详细解释矩阵乘法的原理和计算方法。
一、矩阵乘法的定义矩阵乘法是指将两个矩阵相乘得到一个新的矩阵的运算。
在进行矩阵乘法时,需要满足两个矩阵的列数和行数相等,否则无法进行乘法运算。
具体来说,设A为m行n列的矩阵,B为n行p列的矩阵,则它们的乘积C为一个m行p列的矩阵,其中C的第i行第j列元素为A的第i行与B的第j列对应元素的乘积之和。
二、2x3矩阵乘3x2矩阵的例题现在我们来看一个实际的例题。
假设有两个矩阵A和B,分别为:A = [1 2 3][4 5 6]B = [7 8][9 10][11 12]要求计算A与B的乘积C,即C = A * B。
根据矩阵乘法的定义,我们可以得到C的大小为2x2,即C = [c11 c12; c21 c22]。
接下来,我们按照矩阵乘法的计算方法,逐一计算出C的每一个元素。
首先计算c11,根据定义有:c11 = a11 * b11 + a12 * b21 + a13 * b31将A和B的对应元素代入上式,得到:c11 = 1 * 7 + 2 * 9 + 3 * 11 = 58同理,我们可以计算出C的其他元素:c12 = a11 * b12 + a12 * b22 + a13 * b32= 1 * 8 + 2 * 10 + 3 * 12= 64c21 = a21 * b11 + a22 * b21 + a23 * b31= 4 * 7 + 5 * 9 + 6 * 11= 139c22 = a21 * b12 + a22 * b22 + a23 * b32= 4 * 8 + 5 * 10 + 6 * 12= 154因此,我们得到了矩阵A与B的乘积C为:C = [58 64][139 154]三、矩阵乘法的性质除了以上的计算方法,矩阵乘法还具有一些重要的性质,包括结合律、分配律和乘法单位元等。
1. 结合律矩阵乘法具有结合律,即对于任意的矩阵A、B和C,都有:(A * B) * C = A * (B * C)2. 分配律矩阵乘法具有分配律,即对于任意的矩阵A、B和C,都有:A * (B + C) = A * B + A * C(B + C) * A = B * A + C * A3. 乘法单位元对于任意的m行n列矩阵A,都存在一个n行n列的单位矩阵I,使得:A * I = I * A = A其中,单位矩阵I的定义为对角线上的元素均为1,其余元素均为0的n行n列矩阵。
矩阵连乘题目
矩阵连乘题目矩阵连乘是一种常见的矩阵运算,其目的是将多个矩阵按照一定的顺序相乘,以得到最终的结果矩阵。
题目:给定一组矩阵 $A_1, A_2, \ldots, A_n$,其中每个矩阵 $A_i$ 的维度为 $d_i \times d_{i+1}$,求这组矩阵连乘的乘积 $A_1 A_2 \cdotsA_n$。
解题思路:1. 首先,我们需要确定矩阵连乘的顺序。
由于矩阵的乘法不满足交换律,因此矩阵连乘的顺序会影响最终的结果。
为了最小化计算量,我们可以使用一种称为“矩阵链乘法”的方法来确定最优的乘法顺序。
2. 接下来,我们需要计算每个矩阵的列数,以便确定它们之间的维度关系。
根据题目,每个矩阵 $A_i$ 的维度为 $d_i \times d_{i+1}$,因此我们可以得到一个维度数组 $d = [d_1, d_2, \ldots, d_n]$。
3. 然后,我们可以使用动态规划的方法来求解最优的矩阵连乘顺序。
具体来说,我们可以定义一个二维数组 $m$,其中 $m[i][j]$ 表示将矩阵 $A_i,A_{i+1}, \ldots, A_j$ 按照最优顺序相乘所需的最小计算量。
4. 最后,我们可以通过迭代计算 $m[i][j]$ 的值来得到最终的最小计算量。
具体地,对于每个 $i < j$,我们可以计算 $m[i][j]$ 的值,并将其与之前计算得到的值进行比较,以更新最小计算量。
算法步骤:1. 初始化一个空数组 $m$,长度为 $n$。
2. 对于每个 $i = 1, 2, \ldots, n-1$,计算 $m[i][i+1] = 0$。
3. 对于每个 $j = 2, 3, \ldots, n$,对于每个 $i = 1, 2, \ldots, j-1$,计算$m[i][j] = +\infty$。
4. 对于每个 $j = 2, 3, \ldots, n$,对于每个 $i = 1, 2, \ldots, j-1$,对于每个 $k = i+1, i+2, \ldots, j-1$,计算 $m[i][j] = m[i][k] + m[k][j] + p_{i-1} \cdot p_k \cdot p_{j-1}$,其中 $p_i = d_i \cdot d_{i+1}$。
矩阵的运算模拟试题
矩阵的运算模拟试题在学习线性代数的过程中,矩阵的运算是一个重要的内容。
通过对矩阵的加法、减法、乘法等运算进行模拟试题的实践,不仅可以巩固对矩阵运算的理论知识的掌握,还可以培养解决实际问题的思维能力。
下面将通过一组矩阵的运算模拟试题,来帮助读者更好地理解和应用矩阵的运算。
1. 已知矩阵 A = [1 3 5; 2 4 6],矩阵 B = [2 4; 6 8; 10 12],计算矩阵A 与矩阵B 的乘积。
解析:矩阵 A 的维度为 2×3,矩阵 B 的维度为 3×2,因此两个矩阵可以进行乘积运算。
乘积的结果矩阵的维度为 2×2。
根据矩阵乘法的定义,我们可以计算出矩阵 A 与矩阵 B 的乘积为:C = A × B = [44 56; 56 74]。
2. 已知矩阵 P = [1 2 -1; 3 4 5; 6 7 8],求矩阵 P 的转置矩阵。
解析:转置矩阵的每个元素通过将原矩阵的行和列对调而得到。
矩阵 P 的转置矩阵为 P^T = [1 3 6; 2 4 7; -1 5 8]。
3. 已知矩阵 Q = [2 -1 3; 4 0 2; -3 1 5],求矩阵 Q 的逆矩阵。
解析:逆矩阵是指存在一个矩阵 B,使得矩阵 Q 与矩阵 B 的乘积为单位矩阵 I。
如果存在逆矩阵的话,我们可以通过求解线性方程组 Q ×B = I 来得到逆矩阵 B。
解该线性方程组后,得到逆矩阵为 B = [-0.3 -0.2 0.4; 1.8 0.4 -0.2; 0.1 -0.2 0.2]。
通过以上三个例题,我们可以看到矩阵的运算在实际中的应用是非常广泛的。
无论是解决线性方程组、计算向量的夹角、图像处理等等,矩阵运算都起到了重要的作用。
除了基本的矩阵运算外,矩阵的运算还可以有更多的应用。
例如,可以通过矩阵运算求解某一系统的平衡状态,或者通过矩阵运算进行数据处理和分析等。
在信息技术领域中,矩阵的运算也被广泛应用于图像处理、卷积神经网络等方面。
矩阵运算练习题
矩阵运算练习题矩阵运算是线性代数中的重要概念,也是数学、工程和计算机科学等领域中常见的计算方法。
通过熟练掌握矩阵运算,我们能够更好地理解和解决实际问题。
本文将提供一些矩阵运算的练习题,帮助读者加深对矩阵运算的理解。
一、矩阵加法矩阵加法是指对两个具有相同行列数的矩阵进行逐元素相加的运算。
假设有两个矩阵A和B,它们的行列数均为m×n。
矩阵A和B的和记作C,即C=A+B。
下面是一道关于矩阵加法的练习题:练习题1:已知矩阵A = [[2, 3], [4, -1]],B = [[1, 2], [0, 3]],求C =A + B。
解答:将A和B逐元素相加,得到C = [[(2+1), (3+2)], [(4+0), (-1+3)]] = [[3, 5], [4, 2]]。
二、矩阵减法矩阵减法是指对两个具有相同行列数的矩阵进行逐元素相减的运算。
同样,假设有两个矩阵A和B,它们的行列数均为m×n。
矩阵A和B的差记作C,即C=A-B。
下面是一道关于矩阵减法的练习题:练习题2:已知矩阵A = [[2, 3], [4, -1]],B = [[1, 2], [0, 3]],求C =A - B。
解答:将A和B逐元素相减,得到C = [[(2-1), (3-2)], [(4-0), (-1-3)]] = [[1, 1], [4, -4]]。
三、矩阵数乘矩阵数乘是指将矩阵的每个元素都乘以一个常数。
假设有一个矩阵A,它的行列数为m×n,常数k,那么k与A的乘积记作B,即B=kA。
下面是一道关于矩阵数乘的练习题:练习题3:已知矩阵A = [[2, 3], [4, -1]],求B = 2A。
解答:将A的每个元素都乘以2,得到B = [[2×2, 2×3], [2×4, 2×(-1)]] = [[4, 6], [8, -2]]。
四、矩阵乘法矩阵乘法是矩阵运算中较为复杂的一种运算。
矩阵的例题
矩阵的例题一. 矩阵乘法1. 已知⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=210021 α是n 维列向量,A=E-aa T ,B=E+2aa T ,求AB 与BA 。
解:显然A 与B 均为n 阶方阵,由矩阵运算规律可得AB =[E-aa T ][E+2aa T ]=E+2aa T -aa T -2aa T aa T =E+(1-2a T a)aa T由于214141210021210021=+=⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎭⎫⎝⎛=ααT ,所以AB= E 。
由于A 与B 是同阶方阵,故由AB= E ,可得必有BA= E 。
注1:对n 维列向量a 来说,aa T 与a T a 有很大不同,由此也说明任意矩阵A ,AA T 与A T A 未必相同,应看仔细,不能混为一谈。
注2:作矩阵运算时,应尽量先根据运算规则进行符号运算,最后将具体数字代入求得结果。
2.设A 与B 是n 阶矩阵,且满足A 2=A ,B 2=B 及(A+B )2=A+B ,求证AB =0。
证明:由于(A+B )2=A 2+AB+BA+B 2,故由已知可得AB+BA=0, (1) 两边分别左,右乘A ,得AB+ABA=0及ABA+BA=0, 故AB+BA=-2ABA 代入(1)式可得AB=0。
二. 幂的运算1.设,,2132,1001,2132Q P A Q P Λ=⎪⎪⎭⎫ ⎝⎛--=⎪⎪⎭⎫ ⎝⎛-=Λ⎪⎪⎭⎫ ⎝⎛=计算nA QP ,。
解:;100121322132E QP =⎪⎪⎭⎫⎝⎛=⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛--= ;122)1(01⎩⎨⎧+=Λ==⎪⎪⎭⎫ ⎝⎛-=Λk n k n En nQP Q QP QP QP P Q P Q P Q P Q P AnnnΛ=ΛΛΛΛ=ΛΛΛ=Λ=)()()(][]][[][⎪⎩⎪⎨⎧+=⎪⎪⎭⎫⎝⎛--==⎩⎨⎧+=Λ=12741272122k n k n E k n QP kn PQ2.已知。
矩阵相乘练习题
矩阵相乘练习题矩阵是线性代数中的重要工具,而矩阵相乘是线性代数中的基本运算之一。
矩阵相乘不仅在理论研究中有着广泛应用,还在实际问题的求解中发挥着重要作用。
为了巩固我们对矩阵相乘的理解,下面将给出一些矩阵相乘的练习题。
练习题 1:已知矩阵 A 如下:2 41 3矩阵 B 如下:5 67 8求矩阵 C = A * B。
解答:C 的元素 cij 可以通过矩阵 A 的第 i 行和矩阵 B 的第 j 列进行内积得到。
c11 = 2*5 + 4*7 = 10 + 28 = 38c12 = 2*6 + 4*8 = 12 + 32 = 44c21 = 1*5 + 3*7 = 5 + 21 = 26c22 = 1*6 + 3*8 = 6 + 24 = 30所以,矩阵 C 为:38 4426 30练习题 2:已知矩阵 A 如下:1 2 34 5 6矩阵 B 如下:7 89 1011 12求矩阵 C = A * B。
解答:C 的元素 cij 可以通过矩阵 A 的第 i 行和矩阵 B 的第 j 列进行内积得到。
c11 = 1*7 + 2*9 + 3*11 = 7 + 18 + 33 = 58c12 = 1*8 + 2*10 + 3*12 = 8 + 20 + 36 = 64c21 = 4*7 + 5*9 + 6*11 = 28 + 45 + 66 = 139c22 = 4*8 + 5*10 + 6*12 = 32 + 50 + 72 = 154所以,矩阵 C 为:58 64139 154练习题 3:已知矩阵 A 如下:1 2 3矩阵 B 如下:456求矩阵 C = A * B。
解答:C 的元素 cij 可以通过矩阵 A 的第 i 行和矩阵 B 的第 j 列进行内积得到。
c11 = 1*4 + 2*5 + 3*6 = 4 + 10 + 18 = 32所以,矩阵 C 为:32练习题 4:已知矩阵 A 如下:1 23 45 6矩阵 B 如下:1 2 34 5 6求矩阵 C = A * B。
十个利用矩阵乘法解决的经典题目
不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。
在数学中,一个矩阵说穿了就是一个二维数组。
一个n 行m 列的矩阵可以乘以一个m 行p 列的矩阵,得到的结果是一个n 行p 列的矩阵,其中的第i 行第j 列位置上的数等于前一个矩阵第i 行上的m 个数与后一个矩阵第j 列上的m 个数对应相乘后所有m 个乘积的和。
比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是一个2行3列的矩阵。
其中,结果的那个4等于2*2+0*1:下面的算式则是一个1 x 3的矩阵乘以3 x 2的矩阵,得到一个1 x 2的矩阵:经 由于矩阵乘法具有结合律,因此A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。
我们可以得A^(n/2) * A (其中n/2取整)。
这就告诉我们,计算A^n 也可以使用二分快速求幂的方法。
例如,为了算出A^25的值,我们只需要递归地计算出A^12、A^6、A^3的值即可。
根据典题目2 给定矩阵A ,请快速计算出A^n (n 个A 相乘)的结果,输出的每个数都mod p 。
到这样的结论:当n 为偶数时,A^n = A^(n/2) * A^(n/2);当n 为奇数时,A^n = A^(n/2) * 这里的一些结果,我们可以在计算过程中不断取模,避免高精度运算。
经典题目3 POJ3233 (感谢rmq )分别相加)。
输出的数据mod m 。
这道题两次二分,相当经典。
首先我们知道,A^i 可以二分求出。
然后我们需要对整个题目的数据规模k 进行二分。
比如,当k=6时,有: A + A^2 + A^3 + A^4 + A^5 + A^6 = 题目大意:给定矩阵A ,求A + A^2 + A^3 + … + A^k 的结果(两个矩阵相加就是对应位置k<=10^9。
(A + A^2 + A^3) + A^3*(A + A^2 + A^3)应用这个式子后,规模k 减小了一半。
矩阵与矩阵的乘法例题
矩阵与矩阵的乘法例题好像目前还没有这方面题目的总结。
这几天连续看到四个问这类题目的人,今天在这里简单写一下。
这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。
不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。
在数学中,一个矩阵说穿了就是一个二维数组。
一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。
比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是一个2行3列的矩阵。
其中,结果的那个4等于2*2+0*1:下面的算式则是一个1 x 3的矩阵乘以3 x 2的矩阵,得到一个1 x 2的矩阵:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律;二,矩阵乘法满足结合律。
为什么矩阵乘法不满足交换律呢?废话,交换过来后两个矩阵有可能根本不能相乘。
为什么它又满足结合律呢?仔细想想你会发现这也是废话。
假设你有三个矩阵A、B、C,那么(AB)C和A(BC)的结果的第i行第j列上的数都等于所有A(ik)*B(kl)*C(lj)的和(枚举所有的k和l)。
经典题目1 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置。
操作有平移、缩放、翻转和旋转这里的操作是对所有点同时进行的。
其中翻转是以坐标轴为对称轴进行翻转(两种情况),旋转则以原点为中心。
如果对每个点分别进行模拟,那么m个操作总共耗时O(mn)。
利用矩阵乘法可以在O(m)的时间里把所有操作合并为一个矩阵,然后每个点与该矩阵相乘即可直接得出最终该点的位置,总共耗时O(m+n)。
假设初始时某个点的坐标为x和y,下面5个矩阵可以分别对其进行平移、旋转、翻转和旋转操作。
预先把所有m个操作所对应的矩阵全部乘起来,再乘以(x,y,1),即可一步得出最终点的位置。
经典题目2 给定矩阵A,请快速计算出A^n(n个A相乘)的结果,输出的每个数都mod p。
矩阵计算练习题
矩阵计算练习题矩阵计算是线性代数中的重要概念,它能够帮助我们解决各种实际问题。
在这篇文章中,我们将通过一些练习题来加深对矩阵计算的理解和应用。
一、矩阵加法和减法1. 已知矩阵A = [[2, 1], [4, 3]],B = [[-1, 2], [5, 0]],求A + B和A - B的结果。
解:矩阵的加法和减法都是对应元素相加或相减。
根据定义,我们可以得到以下结果:A +B = [[2 + (-1), 1 + 2], [4 + 5, 3 + 0]] = [[1, 3], [9, 3]]A -B = [[2 - (-1), 1 - 2], [4 - 5, 3 - 0]] = [[3, -1], [-1, 3]]二、矩阵乘法2. 已知矩阵C = [[1, 2, 3], [4, 5, 6]],D = [[7, 8], [9, 10], [11, 12]],求C × D的结果。
解:矩阵的乘法是按照一定规则进行计算的。
具体计算步骤如下:C ×D = [[(1 × 7) + (2 × 9) + (3 × 11), (1 × 8) + (2 × 10) + (3 × 12)], [(4 × 7) + (5 × 9) + (6 × 11), (4 × 8) + (5 × 10) + (6 × 12)]]= [[58, 64], [139, 154]]三、转置矩阵3. 已知矩阵E = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],求E的转置矩阵。
解:转置矩阵就是将原矩阵的行列互换得到的新矩阵。
对于矩阵E,其转置矩阵记为E^T,计算方法如下:E^T = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]四、矩阵的乘方4. 已知矩阵F = [[1, 2], [3, 4]],求F的平方F^2。
十个利用矩阵乘法解决的经典题目
十个利用矩阵乘法解决的经典题目好像目前还没有这方面题目的总结。
这几天连续看到四个问这类题目的人,今天在这里简单写一下。
这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。
不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。
在数学中,一个矩阵说穿了就是一个二维数组。
一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m 个数对应相乘后所有m个乘积的和。
比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是一个2行3列的矩阵。
其中,结果的那个4等于2*2+0*1:下面的算式则是一个1 x 3的矩阵乘以3 x 2的矩阵,得到一个1 x 2的矩阵:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律;二,矩阵乘法满足结合律。
为什么矩阵乘法不满足交换律呢?废话,交换过来后两个矩阵有可能根本不能相乘。
为什么它又满足结合律呢?仔细想想你会发现这也是废话。
假设你有三个矩阵A、B、C,那么(AB)C和A(BC)的结果的第i行第j列上的数都等于所有A(ik)*B(kl)*C(lj)的和(枚举所有的k和l)。
经典题目1 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置。
操作有平移、缩放、翻转和旋转这里的操作是对所有点同时进行的。
其中翻转是以坐标轴为对称轴进行翻转(两种情况),旋转则以原点为中心。
如果对每个点分别进行模拟,那么m个操作总共耗时O(mn)。
利用矩阵乘法可以在O(m)的时间里把所有操作合并为一个矩阵,然后每个点与该矩阵相乘即可直接得出最终该点的位置,总共耗时O(m+n)。
假设初始时某个点的坐标为x和y,下面5个矩阵可以分别对其进行平移、旋转、翻转和旋转操作。
预先把所有m个操作所对应的矩阵全部乘起来,再乘以(x,y,1),即可一步得出最终点的位置。
经典题目2 给定矩阵A,请快速计算出A^n(n个A相乘)的结果,输出的每个数都mod p。
矩阵的乘法运算法则例题
矩阵的乘法运算法则例题
矩阵的乘法运算法则是一个非常重要的数学概念,它可以用于解
决各种线性代数问题和求解复杂的矩阵表达式。
乘法运算法则涉及矩
阵乘法的基本规则,接下来我们就以一个典型的例子来讨论这个概念。
假设我们有两个矩阵A=[aij]和B=[bij],它们的乘积就是C=[cij](其中i,j分别表示矩阵的行号和列号),那么C=[cij]的每一个元素
cij都可以表示为aikbkj,其中k是在A,B两个矩阵相乘时出现的新
索引(一般将k写成0,1,2...)。
也就是说,cij=∑k=0n−1aikbkj,
其中n是A和B矩阵的列数或者行数(大小相等)。
在乘法的定义中,数学家们使用这个公式来解释矩阵乘法运算法则。
接下来我们将以一个简单的例子来演示矩阵乘法运算法则:假设
有两个3×3的矩阵A和B,其中A为:
A=
|1 2 3|
|1 1 2|
|2 1 3|
B=
|2 1 2|
|0 1 1|
|1 1 0|
那么,A乘以B的结果就是:
C=
|5 4 6|
|3 5 5|
|7 3 8|
现在,为了验证这一结果,我们来看cij元素的计算过程,以c13
元素为例:
c13=a10b01+a11b11+a12b21=2×0+1×1+3×1=7
由上面的例子我们可以看出,c13的值的正确性得到了很好的证明,因此矩阵乘法运算法则被证明是正确的。
总之,矩阵乘法运算法则很容易理解,但是它也是一种非常复杂
的概念,要正确地将它应用到实际计算中,需要花费一点时间和心思。
数学课程矩阵运算练习题及答案
数学课程矩阵运算练习题及答案矩阵运算是数学中的一个重要概念,涉及到矩阵的相加、相减、相乘等操作。
通过练习题的方式,可以巩固和提升对矩阵运算的理解与应用能力。
以下是一些常见的矩阵运算练习题以及它们的答案,供大家参考。
1. 矩阵相加已知矩阵A = (1 2 3; 4 5 6; 7 8 9) 和矩阵B = (9 8 7; 6 5 4; 3 2 1),求A + B。
解答:将同一位置上的元素相加,得到:A +B = (1+9 2+8 3+7; 4+6 5+5 6+4; 7+3 8+2 9+1) = (10 10 10; 10 10 10; 10 10 10)2. 矩阵相减已知矩阵A = (1 2; 3 4) 和矩阵B = (5 6; 7 8),求A - B。
解答:将同一位置上的元素相减,得到:A -B = (1-5 2-6; 3-7 4-8) = (-4 -4; -4 -4)3. 矩阵相乘已知矩阵A = (2 1 -3; 0 -2 1) 和矩阵B = (4 -1; 3 2; -2 1),求A × B。
解答:矩阵A的行数与矩阵B的列数相等,因此可以进行矩阵相乘。
按照矩阵相乘的规则,计算得到:A ×B = (2×4+1×3-3×-2 2×-1+1×2-3×1; 0×4-2×3+1×-2 0×-1-2×2+1×1) = (15 -2; -7 -1)4. 矩阵数量乘法已知矩阵A = (2 4; 6 8),求2A。
解答:将矩阵A中的每个元素乘以2,得到:2A = (2×2 2×4; 2×6 2×8) = (4 8; 12 16)5. 矩阵的转置已知矩阵A = (1 2 3; 4 5 6; 7 8 9),求A的转置矩阵AT。
解答:将矩阵A的行与列互换得到其转置矩阵:AT = (1 4 7; 2 5 8; 3 6 9)6. 矩阵的逆已知矩阵A = (1 2; 3 4),求A的逆矩阵A-1。
leetcode有关于矩阵连乘的题目
矩阵连乘是计算机科学中的重要问题,它涉及到矩阵乘法的次序问题。
在LeetCode上,也有一些与矩阵连乘相关的题目,这些题目涉及到动态规划、递归等算法,对于熟练掌握这些算法的同学来说,可以通过LeetCode的练习更加深入地理解矩阵连乘问题。
下面我们将重点介绍LeetCode上几道与矩阵连乘相关的题目,帮助大家更好地理解和掌握这一重要问题。
一、矩阵链乘问题矩阵链乘问题是LeetCode上经典的动态规划问题之一。
给定一系列的矩阵,要求以最少的乘法次数将它们相乘在一起。
这个问题可以用动态规划来解决,其状态转移方程为:dp[i][j] = min(dp[i][k] + dp[k+1][j] + matrix[i-1]*matrix[k]*matrix[j])其中,dp[i][j]表示从第i个矩阵到第j个矩阵相乘所需的最少次数,matrix数组存储了每个矩阵的行和列。
二、矩阵中的路径矩阵中的路径问题也是LeetCode上与矩阵相关的经典问题之一。
给定一个矩阵和一个字符串,要求判断矩阵是否存在一条路径可以组成给定的字符串。
这个问题可以用深度优先搜索(DFS)来解决,对矩阵中的每一个位置进行递归查找,直到找到符合条件的路径或者遍历完所有可能的路径。
该问题的关键在于如何设计递归函数和辅助函数,以及如何剪枝和优化搜索过程。
三、岛屿的最大面积岛屿的最大面积是经典的与矩阵相关的问题之一。
给定一个由0和1组成的矩阵,求其中由1组成的最大岛屿的面积。
这个问题可以用深度优先搜索(DFS)或者广度优先搜索(BFS)来解决,对矩阵中的每一个位置进行搜索,直到找到一个岛屿为止,然后更新最大岛屿的面积。
这里需要注意如何设计递归函数和辅助函数,以及如何遍历整个矩阵并标记已经搜索过的位置。
总结LeetCode上关于矩阵连乘的题目涉及到了动态规划、递归、深度优先搜索和广度优先搜索等算法。
掌握这些算法对于解决矩阵连乘问题是非常重要的。
通过LeetCode的练习,可以帮助我们更好地理解和掌握这一问题,提高我们的算法水平。
矩阵乘法在生活中的应用实例
矩阵乘法在生活中的应用实例1. 应用背景矩阵乘法是线性代数中的重要概念之一,广泛应用于各个领域。
在生活中,矩阵乘法可以用来描述和解决各种实际问题,例如计算机图形学、电力系统分析、经济学模型等。
本文将介绍几个具体的应用实例,并详细描述其应用背景、应用过程和应用效果。
2. 应用实例2.1 计算机图形学中的3D变换计算机图形学是矩阵乘法的一个重要应用领域。
在3D图形渲染中,物体通常通过变换矩阵来进行平移、旋转和缩放等操作。
这些变换可以通过矩阵乘法来表示和计算。
应用背景在计算机图形学中,我们需要将3D物体投影到2D屏幕上进行显示。
为了实现这一目标,我们需要对物体进行一系列变换操作,包括平移、旋转和缩放等。
这些变换可以通过矩阵乘法来表示,并且可以通过矩阵乘法的组合来实现复杂的变换效果。
应用过程首先,我们需要定义一个物体的模型矩阵,该矩阵描述了物体相对于世界坐标系的位置、旋转和缩放等属性。
然后,我们将模型矩阵与一个视图矩阵相乘,该矩阵描述了摄像机相对于世界坐标系的位置和方向。
最后,将得到的结果与投影矩阵相乘,将3D物体投影到2D屏幕上进行显示。
具体而言,假设我们有一个模型矩阵 M、一个视图矩阵 V 和一个投影矩阵 P。
为了将一个顶点 v 从模型空间变换到裁剪空间(屏幕空间),我们可以使用以下公式:v' = P * V * M * v其中v’ 是变换后的顶点坐标。
应用效果通过使用矩阵乘法来进行3D变换,在计算机图形学中可以实现各种复杂的效果。
例如,通过平移变换可以改变物体在屏幕上的位置;通过旋转变换可以使物体绕某个轴旋转;通过缩放变换可以改变物体的大小等。
这些变换操作都是通过对模型、视图和投影矩阵进行乘法运算来实现的。
2.2 电力系统分析中的潮流计算电力系统分析是矩阵乘法在电力工程领域中的应用之一。
潮流计算是电力系统分析中的重要环节,用于确定电力系统中各个节点的电压和功率等参数。
应用背景在电力系统中,各个节点通过输电线路相互连接。
利 用 矩 阵 乘 法 解 决 的 十 个 经 典 题 目
利用矩阵乘法解决的十个经典题目原作者所有于Matrix67好像目前还没有这方面题目的总结。
这几天连续看到四个问这类题目的人,今天在这里简单写一下。
这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。
不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。
在数学中,一个矩阵说穿了就是一个二维数组。
一个n行m列的矩阵可以乘以一个m行p 列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。
比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是一个2行3列的矩阵。
其中,结果的那个4等于2*2+0*1:下面的算式则是一个1 x 3的矩阵乘以3 x 2的矩阵,得到一个1 x 2的矩阵:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律;二,矩阵乘法满足结合律。
为什么矩阵乘法不满足交换律呢?废话,交换过来后两个矩阵有可能根本不能相乘。
为什么它又满足结合律呢?仔细想想你会发现这也是废话。
假设你有三个矩阵A、B、C,那么(AB)C和A(BC)的结果的第i行第j列上的数都等于所有A(ik)*B(kl)*C(lj)的和(枚举所有的k和l)。
经典题目1 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置。
操作有平移、缩放、翻转和旋转这里的操作是对所有点同时进行的。
其中翻转是以坐标轴为对称轴进行翻转(两种情况),旋转则以原点为中心。
如果对每个点分别进行模拟,那么m 个操作总共耗时O(mn)。
利用矩阵乘法可以在O(m)的时间里把所有操作合并为一个矩阵,然后每个点与该矩阵相乘即可直接得出最终该点的位置,总共耗时O(m+n)。
假设初始时某个点的坐标为x和y,下面5个矩阵可以分别对其进行平移、旋转、翻转和旋转操作。
预先把所有m个操作所对应的矩阵全部乘起来,再乘以(x,y,1),即可一步得出最终点的位置。
清泉州阳光实验学校——矩阵的乘法
28 英寸 30 英寸 32 英寸 34 英寸
ABCDE
假设不同牌子的每条牛仔裤的平均利润分别为:A 为 30 元,
B 为 35 元,C 为 40 元,D 为 25 元,E 为 40 元,试问 28 英寸牛仔 裤在该星期内获得的总利润是多少?
28 英寸牛仔裤的销售量是 ABCDEE 于是 28 英寸牛仔裤的总利润是 1 30 3 35 0 40 1 25 2 40 240〔元〕
假设要求各种规格大小的牛仔裤的总利润,就自然地得出以 下的矩阵乘法
〔1〕 矩阵平面上每个向量〔点〕变成了向量〔点〕因此它是平面到
平面的一个变换.这个变换实际上是把平面上的图形在 y 轴方向 拉伸了两倍.
清泉州阳光实验学校矩阵的乘法
〔1〕某电视台举办歌唱比赛,甲、乙两名选手初、复赛成绩
如下:
初赛 复赛 甲 80 90 乙 86 88
假设规定歌唱比赛最后成绩由初赛和复赛综合裁定,其中初赛占
40%,决赛占 60%,那么甲、乙的最后成绩可用如下矩阵的形式表 示:
〔2〕某牛仔裤商店经销 A、B、C、D、E 五种不同牌子的牛 仔裤,其腰围大小分别有 28 英寸、30 英寸、32 英寸、34 英寸四 种,在一个星期内,该商店的销售情况可用以下矩阵形式表示:
矩阵乘法生活案例
矩阵乘法生活案例我给你讲个矩阵乘法在生活中的超有趣案例。
想象你开了一家超级酷的服装店,店里有两种类型的衣服,上衣和裤子。
我们可以用一个矩阵来表示。
比如说,矩阵A表示你进货的数量,第一行代表上衣,第二行代表裤子。
第一列是小码,第二列是中码,第三列是大码。
假设矩阵A是这样的:begin{bmatrix}10 15 20 8 12 15end{bmatrix}这就意味着你进了10件小码上衣、15件中码上衣、20件大码上衣,然后8件小码裤子、12件中码裤子、15件大码裤子。
现在呢,每种尺码的上衣和裤子价格不一样,而且不同款式的衣服利润也不一样。
我们可以用另一个矩阵B来表示每件衣服的利润,第一行是上衣的利润,第二行是裤子的利润,第一列是小码的利润,第二列是中码的利润,第三列是大码的利润。
假设矩阵B是这样的:begin{bmatrix}5 6 7 3 4 5end{bmatrix}这就是说小码上衣每件利润5元,中码上衣每件利润6元,大码上衣每件利润7元,小码裤子每件利润3元,中码裤子每件利润4元,大码裤子每件利润5元。
那你想知道你总共能赚多少钱吗?这时候就用到矩阵乘法啦。
当我们把矩阵A乘以矩阵B的时候,得到的结果矩阵C就会告诉你总的利润情况。
矩阵C的第一行第一列的元素,就是用矩阵A第一行的元素分别乘以矩阵B第一列的元素然后相加,也就是:(10×5 + 8×3) = 50 + 24 = 74这个74就表示小码衣服(上衣和裤子)总共能赚的钱。
按照这个规则把矩阵乘法做完,得到的矩阵C就会清楚地告诉你不同尺码衣服总共的利润情况啦。
是不是很神奇,就像一个超级算账小能手一样,矩阵乘法能让你轻松算出服装店的盈利情况呢!。
矩阵最小二乘法例题
矩阵最小二乘法例题假设我们有一个线性方程组,形式为Ax=b,其中A是一个m×n的矩阵,x是一个n×1的向量,b是一个m×1的向量。
如果方程组无解,我们可以通过最小二乘法求解一个近似解。
考虑以下例子:假设我们有以下数据点:(1, 2), (2, 3), (3, 4), (4, 5)。
我们希望找到一个线性模型y = mx + b,使得这些数据点尽可能地接近这个模型。
我们可以将这个问题转化为一个线性方程组。
首先,我们定义一个矩阵A和向量b:A = [[1, 1], [2, 1], [3, 1], [4, 1]]b = [[2], [3], [4], [5]]这里,A是一个4×2的矩阵,每一行表示一个数据点的坐标,第一列是x的值,第二列是常数项1。
b是一个4×1的向量,每一行表示对应数据点的y值。
我们的目标是找到一个2×1的向量x,使得Ax≈b。
为了找到最小二乘解,我们可以使用以下公式:x = (A^T * A)^(-1) * A^T * b其中,^T表示矩阵的转置,^(-1)表示矩阵的逆。
现在,我们来计算x:A^T = [[1, 2, 3, 4], [1, 1, 1, 1]]A^T * A = [[30, 10], [10, 4]](A^T * A)^(-1) = [[0.4, -1], [-1, 3.5]]A^T * b = [[40], [14]]将这些值代入公式,我们可以计算出x:x = [[0.4, -1], [-1, 3.5]] * [[40], [14]] = [[-1.2], [4.6]]因此,我们得到的最小二乘解是y = -1.2x + 4.6。
通过这个最小二乘解,我们可以近似地拟合原始数据点,使得它们尽可能地接近线性模型。
矩阵乘法题目
矩阵乘法题目十个利用矩阵乘法解决的经典题目By Matrix67 好像目前还没有这方面题目的总结。
这几天连续看到四个问这类题目的人,今天在这里简单写一下。
这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。
不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。
在数学中,一个矩阵说穿了就是一个二维数组。
一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。
比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是一个2行3列的矩阵。
其中,结果的那个4等于2*2+0*1:下面的算式则是一个1 x 3的矩阵乘以3 x 2的矩阵,得到一个1 x 2的矩阵:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律;二,矩阵乘法满足结合律。
为什么矩阵乘法不满足交换律呢?废话,交换过来后两个矩阵有可能根本不能相乘。
为什么它又满足结合律呢?仔细想想你会发现这也是废话。
假设你有三个矩阵A、B、C,那么(AB)C和A(BC)的结果的第i行第j列上的数都等于所有A(ik)*B(kl)*C(lj)的和(枚举所有的k和l)。
经典题目1 给定n个点,m个操作,构造O(m+n)的算法输出m 个操作后各点的位置。
操作有平移、缩放、翻转和旋转这里的操作是对所有点同时进行的。
其中翻转是以坐标轴为对称轴进行翻转(两种情况),旋转则以原点为中心。
如果对每个点分别进行模拟,那么m个操作总共耗时O(mn)。
利用矩阵乘法可以在O(m)的时间里把所有操作合并为一个矩阵,然后每个点与该矩阵相乘即可直接得出最终该点的位置,总共耗时O(m+n)。
假设初始时某个点的坐标为x和y,下面5个矩阵可以分别对其进行平移、旋转、翻转和旋转操作。
预先把所有m个操作所对应的矩阵全部乘起来,再乘以(x,y,1),即可一步得出最终点的位置。
矩阵实际应用+大例题
cij ai1b1 j ai 2b2 j ai 3b3 j
(i , j 1,2)
5
例
设列矩阵 X x1 , x2 ,, xn T 满足 X T X 1,
E为n阶单位矩阵, H E 2 XX T , 证明H是对称矩 阵, 且HHT E .
证明 H T E 2 XX T
6
1
例 (价格矩阵) 四种食品(Food)在三家商店(Shop)中,单位量的 售价(以某种货币单位计)可用以下矩阵给出
F1 F2 F3 F4
S1 S2 S3
17 7 11 21 15 9 13 19 18 8 15 19
1
例 某航空公司在A,B,C,D四城市之间开辟了若 干航线 ,如图所示表示了四城市间的航班图,如果 从A到B有航班,则用带箭头的线连接 A 与B. B 四城市间的航班图情 况常用表格来表示: A C 到站
a11 a12 A a 21 a22
甲 乙
a13 1 a23 2
丙
b11 B b21 b 31
c11 c12 1 C c c 21 22 2
总收入 总利润
b12 甲 b22 乙 b32 丙 单位 单位 价格 利润
T
E 2 XX
T
T T
E 2 XX T H ,
HH H E 2 XX
T 2
H是对称矩阵 .
T 2
E 4 XX T 4 XX T XX T
E 4 XX T 4 X X T X X T
E 4 XX 4 XX E .
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
好像目前还没有这方面题目的总结。
这几天连续看到四个问这类题目的人,今天在这里简单写一下。
这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。
不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。
在数学中,一个矩阵说穿了就是一个二维数组。
一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。
比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是一个2行3列的矩阵。
其中,结果的那个4等于2*2+0*1:下面的算式则是一个1 x 3的矩阵乘以3 x 2的矩阵,得到一个1 x 2的矩阵:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律;二,矩阵乘法满足结合律。
为什么矩阵乘法不满足交换律呢?废话,交换过来后两个矩阵有可能根本不能相乘。
为什么它又满足结合律呢?仔细想想你会发现这也是废话。
假设你有三个矩阵A、B、C,那么(AB)C 和A(BC)的结果的第i行第j列上的数都等于所有A(ik)*B(kl)*C(lj)的和(枚举所有的k和l)。
经典题目1 给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置。
操作有平移、缩放、翻转和旋转这里的操作是对所有点同时进行的。
其中翻转是以坐标轴为对称轴进行翻转(两种情况),旋转则以原点为中心。
如果对每个点分别进行模拟,那么m个操作总共耗时O(mn)。
利用矩阵乘法可以在O(m)的时间里把所有操作合并为一个矩阵,然后每个点与该矩阵相乘即可直接得出最终该点的位置,总共耗时O(m+n)。
假设初始时某个点的坐标为x和y,下面5个矩阵可以分别对其进行平移、旋转、翻转和旋转操作。
预先把所有m个操作所对应的矩阵全部乘起来,再乘以(x,y,1),即可一步得出最终点的位置。
经典题目2 给定矩阵A,请快速计算出A^n(n个A相乘)的结果,输出的每个数都mod p。
由于矩阵乘法具有结合律,因此A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。
我们可以得到这样的结论:当n为偶数时,A^n = A^(n/2) * A^(n/2);当n为奇数时,A^n = A^(n/2) * A^(n/2) * A (其中n/2取整)。
这就告诉我们,计算A^n也可以使用二分快速求幂的方法。
例如,为了算出A^25的值,我们只需要递归地计算出A^12、A^6、A^3的值即可。
根据这里的一些结果,我们可以在计算过程中不断取模,避免高精度运算。
经典题目3 POJ3233 (感谢rmq)题目大意:给定矩阵A,求A + A^2 + A^3 + ... + A^k的结果(两个矩阵相加就是对应位置分别相加)。
输出的数据mod m。
k<=10^9。
这道题两次二分,相当经典。
首先我们知道,A^i可以二分求出。
然后我们需要对整个题目的数据规模k进行二分。
比如,当k=6时,有:A + A^2 + A^3 + A^4 + A^5 + A^6 =(A + A^2 + A^3) + A^3*(A + A^2 + A^3)应用这个式子后,规模k减小了一半。
我们二分求出A^3后再递归地计算A + A^2 + A^3,即可得到原问题的答案。
经典题目4 VOJ1049题目大意:顺次给出m个置换,反复使用这m个置换对初始序列进行操作,问k次置换后的序列。
m<=10, k<2^31。
首先将这m个置换“合并”起来(算出这m个置换的乘积),然后接下来我们需要执行这个置换k/m次(取整,若有余数则剩下几步模拟即可)。
注意任意一个置换都可以表示成矩阵的形式。
例如,将1 2 3 4置换为3 1 2 4,相当于下面的矩阵乘法:置换k/m次就相当于在前面乘以k/m个这样的矩阵。
我们可以二分计算出该矩阵的k/m 次方,再乘以初始序列即可。
做出来了别忙着高兴,得意之时就是你灭亡之日,别忘了最后可能还有几个置换需要模拟。
经典题目5 《算法艺术与信息学竞赛》207页(2.1代数方法和模型,[例题5]细菌,版次不同可能页码有偏差)大家自己去看看吧,书上讲得很详细。
解题方法和上一题类似,都是用矩阵来表示操作,然后二分求最终状态。
经典题目6 给定n和p,求第n个Fibonacci数mod p的值,n不超过2^31 根据前面的一些思路,现在我们需要构造一个2 x 2的矩阵,使得它乘以(a,b)得到的结果是(b,a+b)。
每多乘一次这个矩阵,这两个数就会多迭代一次。
那么,我们把这个2 x 2的矩阵自乘n次,再乘以(0,1)就可以得到第n个Fibonacci数了。
不用多想,这个2 x 2的矩阵很容易构造出来:经典题目7 VOJ1067我们可以用上面的方法二分求出任何一个线性递推式的第n项,其对应矩阵的构造方法为:在右上角的(n-1)*(n-1)的小矩阵中的主对角线上填1,矩阵第n行填对应的系数,其它地方都填0。
例如,我们可以用下面的矩阵乘法来二分计算f(n) = 4f(n-1) - 3f(n-2) + 2f(n-4)的第k项:利用矩阵乘法求解线性递推关系的题目我能编出一卡车来。
这里给出的例题是系数全为1的情况。
经典题目8 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j。
令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点)。
类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数。
同理,如果要求经过k步的路径数,我们只需要二分求出A^k即可。
经典题目9 用1 x 2的多米诺骨牌填满M x N的矩形有多少种方案,M<=5,N<2^31,输出答案mod p的结果我们以M=3为例进行讲解。
假设我们把这个矩形横着放在电脑屏幕上,从右往左一列一列地进行填充。
其中前n-2列已经填满了,第n-1列参差不齐。
现在我们要做的事情是把第n-1列也填满,将状态转移到第n列上去。
由于第n-1列的状态不一样(有8种不同的状态),因此我们需要分情况进行讨论。
在图中,我把转移前8种不同的状态放在左边,转移后8种不同的状态放在右边,左边的某种状态可以转移到右边的某种状态就在它们之间连一根线。
注意为了保证方案不重复,状态转移时我们不允许在第n-1列竖着放一个多米诺骨牌(例如左边第2种状态不能转移到右边第4种状态),否则这将与另一种转移前的状态重复。
把这8种状态的转移关系画成一个有向图,那么问题就变成了这样:从状态111出发,恰好经过n步回到这个状态有多少种方案。
比如,n=2时有3种方案,111->011->111、111->110->111和111->000->111,这与用多米诺骨牌覆盖3x2矩形的方案一一对应。
这样这个题目就转化为了我们前面的例题8。
后面我写了一份此题的源代码。
你可以再次看到位运算的相关应用。
经典题目10 POJ2778题目大意是,检测所有可能的n位DNA串有多少个DNA串中不含有指定的病毒片段。
合法的DNA只能由ACTG四个字符构成。
题目将给出10个以内的病毒片段,每个片段长度不超过10。
数据规模n<=2 000 000 000。
下面的讲解中我们以ATC,AAA,GGC,CT这四个病毒片段为例,说明怎样像上面的题一样通过构图将问题转化为例题8。
我们找出所有病毒片段的前缀,把n位DNA分为以下7类:以AT结尾、以AA结尾、以GG结尾、以?A结尾、以?G结尾、以?C结尾和以??结尾。
其中问号表示“其它情况”,它可以是任一字母,只要这个字母不会让它所在的串成为某个病毒的前缀。
显然,这些分类是全集的一个划分(交集为空,并集为全集)。
现在,假如我们已经知道了长度为n-1的各类DNA中符合要求的DNA个数,我们需要求出长度为n时各类DNA的个数。
我们可以根据各类型间的转移构造一个边上带权的有向图。
例如,从AT 不能转移到AA,从AT转移到??有4种方法(后面加任一字母),从?A转移到AA有1种方案(后面加个A),从?A转移到??有2种方案(后面加G或C),从GG到??有2种方案(后面加C将构成病毒片段,不合法,只能加A和T)等等。
这个图的构造过程类似于用有限状态自动机做串匹配。
然后,我们就把这个图转化成矩阵,让这个矩阵自乘n次即可。
最后输出的是从??状态到所有其它状态的路径数总和。
题目中的数据规模保证前缀数不超过100,一次矩阵乘法是三方的,一共要乘log(n)次。
因此这题总的复杂度是100^3 * log(n),AC了。
最后给出第9题的代码供大家参考(今天写的,熟悉了一下C++的类和运算符重载)。
为了避免大家看代码看着看着就忘了,我把这句话放在前面来说:Matrix67原创,转贴请注明出处。
#include <cstdio>#define SIZE (1<<m)#define MAX_SIZE 32using namespace std;class CMatrix{public:long element[MAX_SIZE][MAX_SIZE];void setSize(int);void setModulo(int);CMatrix operator* (CMatrix);CMatrix power(int);private:int size;long modulo;};void CMatrix::setSize(int a){for (int i=0; i<a; i++)element[i][j]=0;size = a;}void CMatrix::setModulo(int a){modulo = a;}CMatrix CMatrix::operator* (CMatrix param){CMatrix product;product.setSize(size);product.setModulo(modulo);for (int i=0; i<size; i++)for (int j=0; j<size; j++)for (int k=0; k<size; k++){product.element[i][j]+=element[i][k]*param.element[k][j];product.element[i][j]%=modulo;}return product;}CMatrix CMatrix::power(int exp){CMatrix tmp = (*this) * (*this);if (exp==1) return *this;else if (exp & 1) return tmp.power(exp/2) * (*this);else return tmp.power(exp/2);}int main(){const int validSet[]={0,3,6,12,15,24,27,30};long n, m, p;CMatrix unit;scanf("%d%d%d", &n, &m, &p);unit.setSize(SIZE);for(int i=0; i<SIZE; i++)if( ((~i)&j) == ((~i)&(SIZE-1)) ){bool isV alid=false;for (int k=0; k<8; k++)isValid=isValid||(i&j)==validSet[k];unit.element[i][j]=isValid;}unit.setModulo(p);printf("%d", unit.power(n).element[SIZE-1][SIZE-1] );return 0;}本文来自CSDN博客,转载请标明出处:/matrix67/archive/2007/08/04/4780284.aspx。