(最大矩阵链乘)Matrix-chain product
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]。
之前的乘法可以递归地进行。
public class Q1_Matrix_chain {
public static int[] atest ={30,35,15,5,10,20,25};
public static int[] a={3, 5, 2, 1, 10};
public static int[] b={2, 7, 3, 6, 10};
public static int[] c={10, 3, 15, 12, 7, 2};
public static int[] d={7, 2, 4, 15, 20, 5};
public static void main(String[] args)
{
System.out.println("<3, 5, 2, 1,10>");
Matrix_Chain_Order(a);
System.out.println("<2, 7, 3, 6, 10>");
Matrix_Chain_Order(b);
System.out.println("<10, 3, 15, 12, 7, 2>");
Matrix_Chain_Order(c);
System.out.println("<7, 2, 4, 15, 20, 5>");
Matrix_Chain_Order(d); } public static void Matrix_Chain_Order(int[] a){
int n = a.length-1;
int[][] m = new int[n+1][n+1];
int[][] s = new int[n+1][n+1];
int i,j,k,t; for (i=0;i<=n;i++)
m[i][i] = 0;
for (i=0;i<=n;i++)
s[i][i] = 0;
for(t=2; t<=n; t++) //t is the chain length
{
for(i=1;i<=n-t+1;i++)//从第一矩阵开始计算,计算长度为t的最小代价
{
j = i+t-1;//长度为t时候的最后一个元素
m[i][j] = 1000000;//初始化为最大代价
for(k=i;k<=j-1;k++)//寻找最优的k值,使得分成两部分k在i与j-1之间
{
int temp = m[i][k]+m[k+1][j] + a[i-1]*a[k]*a[j];
if(temp < m[i][j])
{
m[i][j] = temp; //记录下当前的最小代价
s[i][j] = k; //记录当前的括号位置,即矩阵的编号
}
}
}
}
System.out.println("一个最优解为:");
Display(s,1,n);
System.out.println("\n计算的次数为:");
System.out.println(m[1][n]);
}
public static void Display(int[][] s,int i,int j)
{
if( i == j)
{
System.out.print('A');
System.out.print(i);
}
else
{
System.out.print('(');
Display(s,i,s[i][j]);
Display(s,s[i][j]+1,j);
System.out.print(')');
} } }
(最大矩阵链乘)Matrix-chain product的更多相关文章
- UVA442 矩阵链乘 Matrix Chain Multiplication
题意: 这道题也是在不改变原序列每个元素位置的前提下,看每个元素与他身边的两个元素那个先结合能得到最大的能量 题解: 很明显这是一道区间dp的题目,这道题要断环成链,这道题需要考虑在这个区间上某个元素 ...
- UVa 442 Matrix Chain Multiplication(矩阵链,模拟栈)
意甲冠军 由于矩阵乘法计算链表达的数量,需要的计算 后的电流等于行的矩阵的矩阵的列数 他们乘足够的人才 非法输出error 输入是严格合法的 即使仅仅有两个相乘也会用括号括起来 并且括号中 ...
- UVa442 Matrix Chain Multiplication
// UVa442 Matrix Chain Multiplication // 题意:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.假定A和m*n的,B是n*p的,那么AB是m*p的,乘法 ...
- 【UVa-442】矩阵链乘——简单栈练习
题目描述: 输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.如果乘法无法进行,输出error. Sample Input 9 A 50 10 B 10 20 C 20 5 D 30 35 E ...
- COJ 0016 20603矩阵链乘
传送门:http://oj.cnuschool.org.cn/oj/home/solution.htm?solutionID=35454 20603矩阵链乘 难度级别:B: 运行时间限制:1000ms ...
- Algorithm --> 矩阵链乘法
动态规划--矩阵链乘法 1.矩阵乘法 Note:只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义.一个m×r的矩阵A左乘一个r×n的矩阵B,会得到一个m×n的矩阵C. #include ...
- Matrix Chain Multiplication (堆栈)
题目链接:https://vjudge.net/problem/UVA-442 题目大意:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.如果乘法无法进行,输出error. 假定A是m*n的矩 ...
- 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 ...
- ACM学习历程——UVA442 Matrix Chain Multiplication(栈)
Description Matrix Chain Multiplication Matrix Chain Multiplication Suppose you have to evaluate ...
随机推荐
- faster rcnn算法及源码及论文解析相关博客
1. 通过代码理解faster-RCNN中的RPN http://blog.csdn.net/happyflyy/article/details/54917514 2. faster rcnn详解 R ...
- Chapter8(IO库) --C++Prime笔记
1.IO对象不能拷贝或对IO对象赋值,进行IO操作的函数通常是以引用方式传递和返回流. 2.一个流一旦发生错误,其上的后续的IO操作都会失败.代码通常应该在使用一个流之前检查它是否处于良好状态.确定一 ...
- matlab绘制实用日历实例代码
function TheStudy;%函数名 close all;%关闭所有床头 DD={'Sun','Mon','Tue','Wed','Thu','Fri','Sat'};%日历表头文字 figu ...
- Linux最大文件句柄(文件描述符)限制和修改
转自:http://jameswxx.iteye.com/blog/2096461 写这个文章是为了以正视听,网上的文章人云亦云到简直令人发指.到底最大文件数被什么限制了?too many open ...
- [大数据]-hadoop2.8和spark2.1完全分布式搭建
一.前期准备工作: 1.安装包的准备: VMware(10.0版本以上) : 官方网站:https://www.vmware.com/cn.html 官方下载地址:http://www.vmware. ...
- day20 GUI(Graphics User Interface)
顶层容器:JWindow.JFrame.JDialge.JAsplet JFrame,默认布局是边界布局 JFrame的内容面板是:Container. 面板容器:JPanel,默认布局是流布局. 布 ...
- MVVM模式原则
1.MVVM简介 这个模式的核心是ViewModel,它是一种特殊的model类型,用于表示程序的UI状态.它包含描述每个UI控件的状态的属性.例如,文本输入域的当前文本,或者一个特定按钮是否可用.它 ...
- 科学计算三维可视化---TraitsUI(Group对象组织界面)
使用Group对象组织界面 将一组相关的Item对象组织在一起 from traitsui.api import Group from traits.api import HasTraits,Int, ...
- 生死相依:说说JQuery中die()、live()详解[翻译]
一个web前端工程师,应该知道jquery的.live()函数,知道它是做什么用的,但是不知它是怎么样工作的,使用起来也是不得得心应手的,甚至也没听说过.die()(去掉bind事件).即使你能熟悉这 ...
- 【算法专题】后缀自动机SAM
后缀自动机是用于识别子串的自动机. 学习推荐:陈立杰讲稿,本文记录重点部分和感性理解(论文语言比较严格). 刷题推荐:[后缀自动机初探],题目都来自BZOJ. [Right集合] 后缀自动机真正优于后 ...