矩阵连乘(备忘录方法:自顶向下递归)
2014-11-26 19:53
225 查看
#include<iostream> #include<vector> #include<iterator> #include<algorithm> using namespace std; /* *矩阵连乘(备忘录方法:自顶向下递归) */ vector<vector<int>> m;//m[i][j]表示矩阵Ai连乘到Aj的最少运算次数 vector<vector<int>> s;//s[i][j]记录矩阵Ai和矩阵Aj之间的分割点 //计算该连乘式子的最佳结合方式 int MatrixChain(vector<int>& p,int beg, int end) { if(m[beg][end]>0) return m[beg][end]; if(beg==end) return 0; int u = MatrixChain(p,beg,beg)+MatrixChain(p,beg+1,end)+p[beg-1]*p[beg]*p[end]; s[beg][end] = beg; for (int K = beg+1; K <end ; K++) { int t = MatrixChain(p,beg,K) + MatrixChain(p,K+1,end) + p[beg-1]*p[K]*p[end]; if (t<u) { u = t;s[beg][end] = K; } } m[beg][end] = u; return u; } //输出该连乘式子的最佳结合方式 void PrintMatrixChain(int n,int m) { if(n==m) { cout<<"A"<<n; return; } int k = s [m]; if(n==k) PrintMatrixChain(n,k); else { cout<<"("; PrintMatrixChain(n,k); cout<<")"; } if(k+1==m) PrintMatrixChain(k+1,m); else { cout<<"("; PrintMatrixChain(k+1,m); cout<<")"; } } int main() { vector<int> vec; copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(vec)); int n = vec.size()-1;//一共有n个矩阵相乘 m = vector<vector<int>>(n+1,vector<int>(n+1,0));//0行0列空余 s = vector<vector<int>>(n+1,vector<int>(n+1,0));//0行0列空余 //初始化m数组 for(int i = 0;i<=n;i++) m[i][i] = 0; int u = MatrixChain(vec,1,n); cout<<"最优解为计算"<<u<<"次乘法!"<<endl; PrintMatrixChain(1,vec.size()-1); }
相关文章推荐
- C#实现递归矩阵连乘(动态规划的递归自顶向下,非递归自地向上)
- 矩阵连乘的动态规划算法(包括递归的备忘录方法)
- 动态规划-3.1.3矩阵连乘问题之备忘录方法(自顶向下)
- 矩阵连乘的JAVA实现(动态规划,递归)
- 矩阵连乘问题(动态规划算法+备忘录方法)
- 矩阵连乘详解
- 动态规划-矩阵连乘问题
- 动态规划之矩阵连乘
- FZU 1061 矩阵连乘
- 矩阵连乘ing
- HDU1588(矩阵连乘求和)
- 算法[动态规划]-矩阵连乘问题
- POJ3070 Fibonacci (矩阵连乘)
- UVA 10870 Recurrences 矩阵连乘 快速幂取模
- 动态规划之矩阵连乘
- 第十三周-递归求奇数连乘的积
- 13周项目1——递归求奇数连乘的积
- 动态规划算法之矩阵连乘 及最长公共字符串多种解法源码
- 矩阵连乘问题的动态规划算法(java)
- fibonacci扩展+矩阵连乘