算法分析与设计-06-矩阵连乘问题
2016-11-13 18:02
309 查看
矩阵连乘问题:
#include <stdio.h> #include <iostream> #define NUM 51 int n; int p[NUM]; int m[NUM][NUM]; int s[NUM][NUM]; void matrixChain() { for(int i=1;i<=n;i++) //填主对角线d1 { m[i][i]=0; } for(int r=2;r<=n;r++)//填次对角线dr(r=2~n) { for(int i=1;i<=n-r+1;i++)//填次对角线的各个元素 { int j=i+r-1;//计算次对角线dr上第i行的元素的列标 m[i][j]=m[i+1][j]+ p[i-1]*p[i]*p[j];//用计算Ai(Ai+1…Aj)的次数作为m[i][j]的初始值 s[i][j]=i;//保存分界点 for(int k=i+1;k<j;k++) {//用m[i][k]和m[k+1][j]计算m[i][j]的新值 int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; if(t<m[i][j]) { m[i][j]=t; s[i][j]=k; } } } } } void TraceBack(int i, int j) { if(i == j){ printf("A%d", i); } if(i < j){ printf("("); TraceBack(i, s[i][j]); TraceBack(s[i][j]+1, j); printf(")"); } } int main() { printf("输入n:\n"); scanf("%d",&n); printf("输入数组p[i]:\n"); for(int i=0;i<=n;i++) scanf("%d",&p[i]); matrixChain();//调用函数 printf("\n\n"); printf("输出矩阵的m[][]:\n"); for(int i=1;i<=n;i++)//输出矩阵的m[][]的值 { for(int j=1;j<=n;j++) { printf("%d\t",m[i][j]); } printf("\n"); } printf("\n\n"); printf("输出矩阵的s[][]:\n"); for(int i=1;i<=n;i++)//输出矩阵的s[][]的值 { for(int j=1;j<=n;j++) { printf("%d\t",s[i][j]); } printf("\n"); } printf("\n\n"); printf("输出最优计算次序\n"); TraceBack(1, n); return 0; }运行效果:
相关文章推荐
- 算法设计与分析--矩阵连乘顺序问题…
- 算法分析与设计矩阵连乘问题
- 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——矩阵连乘问题
- 算法分析与设计——矩阵连乘问题
- 动态规划——矩阵连乘的问题
- 动态规划——矩阵连乘的问题
- 动态规划--矩阵连乘问题
- 动态规划-矩阵连乘问题
- 动态规划——矩阵连乘问题
- 算法分析与设计--0/1背包问题(回溯法)
- 动态规划——矩阵连乘的问题
- DP之矩阵连乘问题
- 矩阵连乘问题的一个具体实现
- 动态规划之矩阵连乘问题
- 第3章 动态规划 矩阵连乘问题
- 矩阵连乘问题的非动态解法
- 动态规划——矩阵连乘问题
- 矩阵连乘问题的动态规划算法(java)
- 矩阵连乘问题
- 动态规划——矩阵连乘的问题