Matrix-chain product. The following are some instances.

a)       <3, 5, 2, 1,10>

b)       <2, 7, 3, 6, 10>

c)       <10, 3, 15, 12, 7, 2>

d)       <7, 2, 4, 15, 20, 5>

矩阵链乘积:

应用动态规划方法:

  • 1.刻画一个最优解的结构特征
  • 2.递归地定义最优解的值
  • 3.计算最优解的值,采用自底向上的方法
  • 4.利用计算出的信息构造一个最优解

思想:

1.最优括号化方案的结构特征

用记号A[i..j]表示乘积A[i]A[i+1]..A[j]求值的结果,其中i <=j 。

假设A[i]A[i+1]...A[j]的一个最优解括号把乘积在A[k]和A[k+1]之间分开,则对A[i]A[i+1]...A[j]最优解括号化方案中的“前缀”子链A[i]A[i+1]...A[k]的最优括号化的方法,必须是A[i]A[i+1]...A[k]的一个最有解括号化方案,类似的,A[k+1]A[k+2]…A[j]同理。

2.设m[i][j]为计算矩阵A[i..j]所需的标量乘法运算次数的最小值;

对整个问题,计算A[1..n]的最小代价就是m[1][n]。

假设最优加全部括号将乘积A[i]A[i+1]...A[j]从A[k]和A[k+1]之间分开,i <= k < j。

则:m[i][j] = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]

关于对乘积A[i]A[i+1]...A[j]加全部括号的最小代价的递归定义为:

m[i][j] = 0   if i == j

m[i][j] = min(i<=k<j){m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]}  s[i][j]=k   if i < j

用s[i][j]记录最优值m[i][j]的对应的分割点。

3.用迭代自底向上的表格法来计算最优代价。

4.利用保存在表格s[n][n]内的、经过计算的信息来构造一个最优解。

按最优方式计算A[1..n]时,最终矩阵相乘次序是A[1..s[1][n]]A[a[1][n]+1..n]。

之前的乘法可以递归地进行。

  1. public class Q1_Matrix_chain {
  2. public static int[] atest ={30,35,15,5,10,20,25};
  3. public static int[] a={3, 5, 2, 1, 10};
  4. public static int[] b={2, 7, 3, 6, 10};
  5. public static int[] c={10, 3, 15, 12, 7, 2};
  6. public static int[] d={7, 2, 4, 15, 20, 5};
  7. public static void main(String[] args)
  8. {
  9. System.out.println("<3, 5, 2, 1,10>");
  10. Matrix_Chain_Order(a);
  11. System.out.println("<2, 7, 3, 6, 10>");
  12. Matrix_Chain_Order(b);
  13. System.out.println("<10, 3, 15, 12, 7, 2>");
  14. Matrix_Chain_Order(c);
  15. System.out.println("<7, 2, 4, 15, 20, 5>");
  16. Matrix_Chain_Order(d);
  17.  
  18. }
  19.  
  20. public static void Matrix_Chain_Order(int[] a){
  21. int n = a.length-1;
  22. int[][] m = new int[n+1][n+1];
  23. int[][] s = new int[n+1][n+1];
  24. int i,j,k,t;
  25.  
  26. for (i=0;i<=n;i++)
  27. m[i][i] = 0;
  28. for (i=0;i<=n;i++)
  29. s[i][i] = 0;
  30. for(t=2; t<=n; t++) //t is the chain length
  31. {
  32. for(i=1;i<=n-t+1;i++)//从第一矩阵开始计算,计算长度为t的最小代价
  33. {
  34. j = i+t-1;//长度为t时候的最后一个元素
  35. m[i][j] = 1000000;//初始化为最大代价
  36. for(k=i;k<=j-1;k++)//寻找最优的k值,使得分成两部分k在i与j-1之间
  37. {
  38. int temp = m[i][k]+m[k+1][j] + a[i-1]*a[k]*a[j];
  39. if(temp < m[i][j])
  40. {
  41. m[i][j] = temp; //记录下当前的最小代价
  42. s[i][j] = k; //记录当前的括号位置,即矩阵的编号
  43. }
  44. }
  45. }
  46. }
  47. System.out.println("一个最优解为:");
  48. Display(s,1,n);
  49. System.out.println("\n计算的次数为:");
  50. System.out.println(m[1][n]);
  51. }
  52. public static void Display(int[][] s,int i,int j)
  53. {
  54. if( i == j)
  55. {
  56. System.out.print('A');
  57. System.out.print(i);
  58. }
  59. else
  60. {
  61. System.out.print('(');
  62. Display(s,i,s[i][j]);
  63. Display(s,s[i][j]+1,j);
  64. System.out.print(')');
  65. }
  66.  
  67. }
  68.  
  69. }

(最大矩阵链乘)Matrix-chain product的更多相关文章

  1. UVA442 矩阵链乘 Matrix Chain Multiplication

    题意: 这道题也是在不改变原序列每个元素位置的前提下,看每个元素与他身边的两个元素那个先结合能得到最大的能量 题解: 很明显这是一道区间dp的题目,这道题要断环成链,这道题需要考虑在这个区间上某个元素 ...

  2. UVa 442 Matrix Chain Multiplication(矩阵链,模拟栈)

    意甲冠军  由于矩阵乘法计算链表达的数量,需要的计算  后的电流等于行的矩阵的矩阵的列数  他们乘足够的人才  非法输出error 输入是严格合法的  即使仅仅有两个相乘也会用括号括起来  并且括号中 ...

  3. UVa442 Matrix Chain Multiplication

    // UVa442 Matrix Chain Multiplication // 题意:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.假定A和m*n的,B是n*p的,那么AB是m*p的,乘法 ...

  4. 【UVa-442】矩阵链乘——简单栈练习

    题目描述: 输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.如果乘法无法进行,输出error. Sample Input 9 A 50 10 B 10 20 C 20 5 D 30 35 E ...

  5. COJ 0016 20603矩阵链乘

    传送门:http://oj.cnuschool.org.cn/oj/home/solution.htm?solutionID=35454 20603矩阵链乘 难度级别:B: 运行时间限制:1000ms ...

  6. Algorithm --> 矩阵链乘法

    动态规划--矩阵链乘法 1.矩阵乘法       Note:只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义.一个m×r的矩阵A左乘一个r×n的矩阵B,会得到一个m×n的矩阵C. #include ...

  7. Matrix Chain Multiplication (堆栈)

    题目链接:https://vjudge.net/problem/UVA-442 题目大意:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.如果乘法无法进行,输出error. 假定A是m*n的矩 ...

  8. UVA——442 Matrix Chain Multiplication

    442 Matrix Chain MultiplicationSuppose you have to evaluate an expression like A*B*C*D*E where A,B,C ...

  9. ACM学习历程——UVA442 Matrix Chain Multiplication(栈)

    Description   Matrix Chain Multiplication  Matrix Chain Multiplication  Suppose you have to evaluate ...

随机推荐

  1. poj 2396 Budget

    一个m行n列的矩阵,给出每行每列中元素的和,以及对一些格子的大小限制,求一个可行方案,输出矩阵. 大小限制形如:严格大于i,严格小于i,等于i. 1<=m<=200.1<=n< ...

  2. python的函数介绍 位置参数 关键字参数 默认参数 参数组 *args **kwargs

    1.数学意义的函数与python中的函数 数学意义的函数 y = 2*3+1 x =3 y =7 x是自变量,y是因变量 2.python中定义函数的方法 一个函数往往都是为了完成一个特定的功能而存在 ...

  3. LazyMay:实现同步和异步任务的顺序执行

    在掘金看到的文章,流程控制同步和异步任务的顺序执行,收益匪浅,工作中能用到. 1.实现以下效果 实现一个LazyMan,可以按照以下方式调用: LazyMan(“Hank”)输出: Hi! This ...

  4. Ubuntu16.04.2安装Tensorflow

    安装aptitude $ sudo apt-get install aptitude 安装python-pip python-dev $ sudo aptitude install python-pi ...

  5. HDU 1564 简单博弈 水

    n*n棋盘,初始左上角有一个石头,每次放只能在相邻的四个位置之一,不能操作者输. 如果以初始石头编号为1作为后手,那么对于每次先手胜的情况其最后一步的四周的编号必定是奇数,且此时编号为偶数,而对于一个 ...

  6. BFS搜索:POJ No 3669 Meteor Shower

    #include <iostream> #include <cstring> #include <queue> #include <cstdio> #i ...

  7. 《设计模式》-原则二:里氏代换原则(LSP)

    回顾一下上一节说的“开闭原则” 说的是 一个软件要遵循对修改关闭 对新功能扩展的原则. 这一次来说说 “里氏代换原则” 意思是说:子类型必须能代替他们的基类. 看了半天的例子 好像 是懂非懂啊...相 ...

  8. InnoDB 引擎独立表空间

    InnoDB 引擎独立表空间   使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构.表索引.表数据空间.我们可以将某个数据库目录直接迁移到 ...

  9. Unity3D 程序打包报错(程序是连接数据库进行处理的)

    打包这个Unity3D的程序时出现错误(程序是由XML数据改成连接数据库): ArgumentException: The Assembly System.Configuration is refer ...

  10. 程序移植到AUTOCAD2013笔记

    1:需要引用acmgd.dll acdbmgd.dll,AcCoreMdg.dll, accui.dll 四个dll 2: 2010下的的acmgd.dll被拆分为acmgd.dll和AcCoreMd ...