动态规划求解矩阵连乘
来源:互联网 发布:恺英网络王悦老婆 编辑:程序博客网 时间:2024/06/04 22:48
问题:
给定n个矩阵{A1,A2,……An},其中Ai与Ai+1是可乘的,i = 1,2,……,n-1。考察这n个矩阵的连乘积A1A2,……,An。加括号的位置不同,计算数乘次数不同。 计算最少数乘次数,并给出最优解。
得出递归式:
m[i][j]= 0 i=j
min{[i][k]+m[k+1][j]+pi-1pkpj} i
#include<iostream.h>#define MAX 100void MatrixChain(int p[MAX],int n,int m[MAX][MAX],int s[MAX][MAX]){ for(int i=1;i<=n;i++) m[i][i]=0; for(int r=2;r<=n;r++) //r控制几个矩阵一起乘 for(int i=1;i<=n-r+1;i++) { int j=i+r-1; //从第i个矩阵乘到第j个矩阵 m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; //m[i][j]记录最优解,先将m[i][j]初始化为用k=i分 s[i][j]=i; //s[i][j]记录在哪个位置分能得到最优解,初始化为i for(int k=i+1;k<j;k++) { 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; //和最小时的k } } }}void Traceback(int i,int j,int s[MAX][MAX]) //构造最优解{ if(i==j) return; Traceback(i,s[i][j],s); Traceback(s[i][j]+1,j,s); cout<<"Multiply A"<<i<<","<<s[i][j]; cout<<"and A"<<(s[i][j]+1)<<","<<j<<endl;}void main(){ int n,m[MAX][MAX],s[MAX][MAX],p[MAX]; cout<<"请输入矩阵个数"<<endl; cin>>n; cout<<"请输入各矩阵维数:"<<endl; for(int i=0;i<=n;i++) //p数组的起始坐标必须比i的起始小1,在p[i-1]中p[0]才有意义 cin>>p[i]; MatrixChain(p,n,m,s); Traceback(1,n,s);}
该组测试数据的计算次序,m[i][j],s[i][j]如图所示。
阅读全文
0 0
- 矩阵连乘 动态规划求解
- 矩阵连乘的动态规划求解
- 矩阵连乘问题-动态规划求解
- 动态规划求解矩阵连乘
- 动态规划求解矩阵连乘问题Java实现
- 动态规划求解矩阵连乘的最优时间复杂度
- java实现动态规划求解矩阵连乘问题
- 矩阵连乘 动态规划
- 矩阵连乘 动态规划
- 矩阵连乘-动态规划
- 动态规划-矩阵连乘
- 动态规划 - 矩阵连乘
- 矩阵连乘--动态规划
- 矩阵连乘--动态规划
- 矩阵连乘 (动态规划)
- 矩阵连乘,动态规划
- 矩阵连乘(动态规划)
- 矩阵连乘----动态规划
- redis入门学习
- 自定义view__封装Dialog-分享功能UI的实现
- zynq学习笔记——EMIO方式模拟I2C时序对ADV7511进行读写
- 策略模式用于封装系列的算法,这些算法通常被封装在一个被称为 Context 类中,客户端程序可以自由选择其中一种算法
- 疯狂的bLue
- 动态规划求解矩阵连乘
- POJ 1973 Software Company 笔记
- Android 进阶16:IntentService 使用及源码解析
- 【Leetcode】58. Length of Last Word
- 流程python学习笔记:第三章(2)
- 以空格为分隔符的字符串提取
- Sort
- Almost Sorted Array HDU
- (牛客网)构建乘积数组