动态规划求矩阵连乘

原创


在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,

则其乘积C=AB是一个p×r的矩阵。由该公式知计算C=AB总共需要pqr次的数乘。其标准计算公式为:

 

现在的问题是,给定n个矩阵{A1,A2,…,An}。其中Ai与Ai+1是可乘的,i=1,2,…,n-1。要求计算出这n个矩阵的连乘积A1A2…An,最少的乘法次数。

递归公式:

 

 

 1 import java.util.*;
 2 
 3 public class 算法分析与设计3_2 {
 4     
 5     static void traceback(int i,int j,int s[][])
 6     {
 7         if(i==j)
 8             System.out.print("A"+i);
 9         else if (i==j-1)
10             System.out.print("(A"+i+"A"+j+")");
11         else
12         {
13             System.out.print("(");
14             traceback(i,s[i][j],s);
15             traceback(s[i][j]+1,j,s);
16             System.out.print(")");
17         }
18      }
19 
20     
21     static void min_Matrix(int matrix[][],int n,int m[][],int s[][]) {
22         for(int i=1;i<=n;i++) {    //单个矩阵
23             m[i][i]=0;
24         }
25         for(int r=2;r<=n;r++) {
26             for(int i=1;i<=n-r+1;i++) {
27                 int j=i+r-1;
28                 m[i][j]=m[i][i]+m[i+1][j]+matrix[i][1]*matrix[i][2]*matrix[j][2];    //分为[i,i]和[i+1,j]两段
29                 s[i][j]=i;
30                 for(int k=i+1;k<j;k++) {    //分为[i,k]和[k+1,j]两段
31                     int t=m[i][k]+m[k+1][j]+matrix[i][1]*matrix[k][2]*matrix[j][2];
32                     if(t<m[i][j]) {
33                         m[i][j]=t;
34                         s[i][j]=k;
35                     }
36                 }
37             }
38         }
39     }
40 
41     public static void main(String[] args) {
42         Scanner reader=new Scanner(System.in);
43         System.out.print("输入矩阵个数: ");
44         int n=reader.nextInt();
45         System.out.print("输入"+n+"个矩阵规模:");
46         int matrix[][]=new int[n+1][3];
47         int m[][]=new int[n+1][n+1];
48         int s[][]=new int[n+1][n+1];
49         for(int i=1;i<=n;i++) {    //输入矩阵规模
50             matrix[i][1]=reader.nextInt();
51             matrix[i][2]=reader.nextInt();
52         }
53         min_Matrix(matrix,n,m,s);
54         System.out.println(m[1][n]);
55         System.out.print("序列:");
56         traceback(1,n,s);
57     }
58 
59 }

15:28:56

2018-10-15

转载于:https://www.cnblogs.com/chiweiming/p/9791271.html

### 回答1: 矩阵连乘问题是一个经典的动态规划问题。给定一系列矩阵它们的连乘积,如何使得计算次数最少? 设矩阵序列为 A1, A2, A3,..., An,其中 Ai 的规模为 pi-1×pi,i=1,2,...,n+1。定义m[i][j]为Ai×Ai+1×...×Aj的最小计算次数,则有递推公式: m[i][j] = min{ m[i][k] + m[k+1][j] + pi-1×pk×pj },其中 i ≤ k < j,i ≤ j ≤ n+1 其中,m[i][i]=0,因为一个矩阵以它自身不需要计算。最终所的结果为m[1][n]。 下面是Python代码实现: ```python def matrix_chain_order(p): n = len(p) - 1 m = [[float('inf') for _ in range(n+1)] for _ in range(n+1)] for i in range(1, n+1): m[i][i] = 0 for l in range(2, n+1): for i in range(1, n-l+2): j = i + l - 1 for k in range(i, j): q = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j] if q < m[i][j]: m[i][j] = q return m[1][n] ``` 其中,p是一个列表,表示矩阵序列每个矩阵的规模。例如,如果有4个矩阵,它们的规模分别为2×3、3×4、4×2、2×5,则p=[2, 3, 4, 2, 5]。 调用matrix_chain_order(p)即可得到最小计算次数。 ### 回答2: 动态规划矩阵连乘问题是一种通过分解问题,将大问题拆分为子问题并逐步解的方法。它主要通过穷举解空间,记录中间计算结果,从而避免重复计算,提高计算效率。 假设有 n 个矩阵需要连乘,我们可以定义一个二维数组 dp,其中 dp[i][j] 表示从第 i 个矩阵到第 j 个矩阵连乘所需的最小计算次数。 首先,我们需要确定问题的状态转移方程。对于 dp[i][j],我们可以将其划分为两段进行计算,从 i 到 k 连乘,再从 k+1 到 j 连乘,其中 i <= k < j。那么 dp[i][j] 可以表示为 dp[i][k] + dp[k+1][j] + 第 i 个矩阵行数 * 第 k+1 个矩阵列数 * 第 j+1 个矩阵列数。 接下来,我们需要确定问题的边界条件。当 i j 相等时,也就是只有一个矩阵时,连乘次数为 0,即 dp[i][i] = 0。而对于其他情况,我们可以将 dp[i][j] 初始化为一个较大的值,比如无穷大。 最后,我们可以使用动态规划的方式进行计算,从长度为 2 的子问题开始,逐步扩展到整个问题规模。具体的计算步骤如下: 1. 初始化 dp 数组,将所有 dp[i][j] 设置为无穷大。 2. 对于长度为 2 的子问题,计算 dp[i][i+1] = 第 i 个矩阵行数 * 第 i 个矩阵列数 * 第 i+1 个矩阵列数。 3. 根据状态转移方程,从长度为 3 的子问题开始计算 dp 数组的其他值。 4. 重复步骤 3,直到计算完整个 dp 数组。 5. 最终,dp[1][n] 即为从第一个矩阵到第 n 个矩阵连乘的最小计算次数。 通过动态规划方法,可以高效地解决矩阵连乘问题,避免了重复计算,提高了计算效率。 ### 回答3: 动态规划矩阵连乘问题是指给定一个矩阵链,解最小的矩阵连乘次数以及括号化方案。首先,我们需要定义一个矩阵链的表示方法,假设有n个矩阵,那么矩阵链可以表示为[A1,A2,...,An]。 接下来,我们需要定义一个二维的动态规划数组dp,其中dp[i][j]表示从矩阵Ai到矩阵Aj的最小连乘次数。根据动态规划的思想,我们可以得到以下状态转移方程: dp[i][j] = min(dp[i][k] + dp[k+1][j] + cost[i-1] * cost[k] * cost[j]),其中i ≤ k < j。 其中,cost数组表示矩阵Ai的行数矩阵Aj的列数,cost的长度为n+1,其中,cost[0]表示矩阵A1的行数,cost[n]表示矩阵An的列数。 根据上述状态转移方程,我们可以使用双重循环来计算dp数组的值。外层循环控制子问题规模,内层循环用于遍历所有的子问题。 最后,根据dp数组的值,可以通过递归的方式构造出最小连乘次数对应的括号化方案。 综上所述,通过动态规划算法,我们可以矩阵连乘问题,得到最小的矩阵连乘次数以及括号化方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值