矩阵链乘法 算法导论
来源:互联网 发布:python调用命令行 编辑:程序博客网 时间:2024/06/05 23:40
[1003] 矩阵链乘法(http://ac.nbutoj.com/Problem/view.xhtml?id=1003)
- 时间限制: 1000 ms 内存限制: 65535 K
- 问题描述
给定一个有n个矩阵的矩阵链A1A2A3…An,其中矩阵Ai(i=1,2,3…n)的维度为pi-1*pi。我们知道,两个维度分别为m*r和r*n的矩阵用一般的矩阵乘法相乘,所需的运算次数为m*r*n,最后得到一个维度为m*n的结果矩阵。对于矩阵链问题,因为矩阵乘法具有结合律,其运算顺序有很多中选择。换句话说,不论如何括号其乘积,最后结果都会是一样的。例如,若有四个矩阵A、B、C和D,将可以有:
(ABC)D = (AB)(CD) = A(BCD) = A(BC)D = ...
但括号其乘积的顺序会影响到需要计算乘积所需简单算术运算的数目,即其效率。例如,设A为一10*30矩阵,B为30*5矩阵与C为5*60矩阵,则:
(AB)C有(10*30*5) + (10*5*60) = 1500 + 3000 = 4500 个运算A(BC)有(30*5*60) + (10*30*60) = 9000 + 18000 = 27000 个运算...
明显地,第一种方式要有效多了。所以,矩阵链乘法问题也就是如何对矩阵乘积加括号,使得它们的乘法次数达到最少。
- 输入
- 输入的第一行为一个正整数n(1<=n<=200)。表示矩阵的个数。
输入的第二行包含n+1个整数,分别表示pi(0<=i<=n),其中每个pi在[1,200]范围内。 - 输出
- 输出一个整数表示最少要进行的乘法次数。
- 样例输入
31 2 3 4310 30 5 60
- 样例输出
184500
- 提示
无
- 来源
Timebug
- #include <stdio.h>
#include <stdlib.h>
#define _DEBUG 0
#define MAXN 205
#define INF 0x3c3c3c3c
int c[MAXN][MAXN];
int p[MAXN];
int solve(int n){
int i,j,l,k;
//初始化
for(i=0;i<=n;i++)
c[i][i]=0;
for(l=1;l<n;l++){
for(i=1;i<=n-l;i++){
j=i+l;
c[i][j]=INF;
for(k=i;k<j;k++){
int t;
if((t=c[i][k]+c[k+1][j]+p[i-1]*p[k]*p[j])<c[i][j])
c[i][j]=t;
}
}
}
return c[1][n];
}
int main(){
#if _DEBUG==1
freopen("1003.in","r",stdin);
#endif
int n,i;
while(scanf("%d",&n)!=EOF){
for(i=0;i<=n;i++){
scanf("%d",&p[i]);
}
printf("%d\n",solve(n));
}
}
- 算法导论-矩阵链乘法
- 矩阵链乘法 算法导论
- 矩阵链乘法--【算法导论】
- 【算法导论】矩阵链乘法
- 算法导论 矩阵链乘法
- 【算法导论】矩阵乘法
- [算法导论读书笔记]矩阵链乘法
- 算法导论十五章--矩阵链乘法
- 算法导论 动态规划 矩阵链乘法
- 算法导论——矩阵链乘法
- 算法导论15.2 矩阵链乘法
- 算法导论 DP 矩阵链乘法
- 矩阵链乘法(算法导论)
- 算法导论java矩阵链乘法
- 算法导论——矩阵链乘法
- 算法导论之矩阵链乘法详解
- 《算法导论》矩阵链乘法问题
- 算法导论--------------Strassen矩阵乘法
- PeoPle类
- Java对象初始化详解
- iOS后台定位实现
- Java序列化与反序列化(实践)
- MFC程序显示cannot open file ".\Debug\E0301.res" 无法打开资源文件
- 矩阵链乘法 算法导论
- java基础---this和static
- Apache FileUpload
- Windows窗口
- Delphi XE5 Firemonkey 创建windows 8 应用效果
- 利用SQOOP将数据从数据库导入到HDFS
- Apple Mac OS 下编译Emacs 23
- (精华) FFMpeg框架代码阅读
- 丢失MFC42D.DLL文件,无法找到MFC42D.DLL的完美解决方法