矩阵链乘法,添加括号
2015-06-28 09:59
387 查看
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
Input
有N个矩阵连乘,用一行有n+1个数数组表示,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开.
Output
你的输出应该有C行,即每组测试数据的输出占一行,它是计算出的矩阵最少连乘积次数,输出最优全括号结构
Sample Input
Sample Output
((A1A2)A3)
Input
有N个矩阵连乘,用一行有n+1个数数组表示,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开.
Output
你的输出应该有C行,即每组测试数据的输出占一行,它是计算出的矩阵最少连乘积次数,输出最优全括号结构
Sample Input
10 100 5 50
Sample Output
7500
((A1A2)A3)
#include<stdlib.h> #include<stdio.h> #include <memory.h> #define N 3 int s[N+1][N+1]; //s[i][j]中记录了对Ai...Aj进行分裂的最优的k值 void Print_OPTIMAL_PARENS(int i,int j) //定义函数打印最优全括号的结果 { if(i==j) printf("A%d",i); else { printf("("); Print_OPTIMAL_PARENS(i,s[i][j]); //在分裂处进行递归调用 Print_OPTIMAL_PARENS(s[i][j]+1,j); printf(")"); } } int main() { int matrix[N+1]; //matrix中记录矩阵的维数 int i,j,k,q; int m[N+1][N+1]; //m中记录矩阵连乘的次数 for(i=0;i<=N;i++) scanf("%d",&matrix[i]); memset(m,0,(N+1)*(N+1)*sizeof(int)); for(j=1;j<=N;j++) for (i=j;i>=1;i--) //当i=j时,m[i][j]=0, { //当i<j时,m[i][j]=min{m[i][k]+m[k+1][j]+p(i-1)p(k)p(j)} i=<k<j if (j==i) m[i][j]=0; else { m[i][j]=600000; for (k=i;k<j;k++) { q=m[i][k]+m[k+1][j]+matrix[i-1]*matrix[k]*matrix[j]; if (q<m[i][j]) { m[i][j]=q; s[i][j]=k; } } } } printf("%d\n",m[1] ); Print_OPTIMAL_PARENS(1,N); return 0; }
相关文章推荐
- CSS3学习笔记-1:CSS样式继承
- 六月份英语
- Developer Blogs
- something about kali
- 网络编程
- python 中 常用到的 numpy 函数 整理
- 新锐房地产销售管理系统(部分流程)技术解析(八) 销售管理_预定管理
- Android - 错: java.lang.IllegalStateException: Already attached
- PL/SQL Block Structure
- 词法分析学习-手工构词
- DataTable读写到XML文件的正确方法(以及对缺少根元素问题的处理)
- ACCESS通过一个连接写入的数据,另一个连接却读取不出来
- js类型判断的方法
- 软件测试行业趋势分析和思考
- nodejs使用connect-mongodb报错(Please ensure that you set the default write concern)
- hdoj1421_搬寝室(dp)
- Android之Notification的多种用法(转)
- myelipse 优化
- 程序员必须知道的10大基础实用算法及其讲解
- 程序员必须知道的10大基础实用算法及其讲解 分类: 算法 2015-06-28 09:54 10人阅读 评论(0) 收藏