矩阵连乘

矩阵连乘的代码,从别处找的,真的非常经典

有好几处可写,但是现在没有时间了

一、这个代码的写法已经完全c++了,非常的面向对象

二、动态规划的算法很奇妙,以本程序为例可以讲很多东西

三、昨天晚上师兄Mr tang在QQ上说了些事,我觉得有写的必要

插入代码:

#include<iostream> #define N 50 using namespace std; class Matrix { public : Matrix(); ~Matrix(); bool run(); bool Recur();//直接递归用 void Memorized();//备忘录 private : int **m; int **s; int *p; int W; bool Input(); bool MatrixChain(); void Traceback(int i,int j,int **s); //一、直接递归解题算法,时间复杂度为O(n3) int RecurMatrixChain(int i,int j); //二、备忘录方法 int LookupChain(int i,int j); int MemorizedMatrixChain(); }; Matrix::Matrix() { int W=0; m=new int*[N]; s=new int*[N]; for(int i=0;i<N;i++) { m[i]=new int[N]; s[i]=new int[N]; } p=new int[N]; } Matrix::~Matrix() { for(int i=0;i<N;i++) { delete []m[i]; delete []s[i]; } delete []m; delete []s; delete []p; } bool Matrix::Input() { int w; cout<<"请输入矩阵个数"<<endl; cin>>w; W=w; cout<<"请输入矩阵维数"<<endl; cin>>p[0]>>p[1]; for(int i=2;i<=W;i++) { int m=p[i-1]; cout<<"请输入矩阵维数"<<endl; cin>>p[i-1]>>p[i]; if(m!=p[i-1]) { cout<<"矩阵不可乘"<<endl; return false; } } return true; } bool Matrix::MatrixChain() { int u; for(int i=1;i<=W;i++) m[i][i]=0; for(int r=2;r<=W;r++) for(int i=1;i<=W-r+1;i++) { int j=i+r-1; m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; s[i][j]=i; for(int k=i+1;k<j;k++) { u = m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; if(u < m[i][j]) { m[i][j]=u; s[i][j]=k; } } } return true; } void Matrix::Traceback(int i,int j,int **s) { if(i == j) cout<<"(A"<<i; else if(i+1 == j) cout<<"(A"<<i<<"A"<<j<<")"; else { cout<<"("; Traceback(i,s[i][j],s); Traceback(s[i][j]+1,j,s); cout<<")"; } } bool Matrix::run() { if(Matrix::Input()) { if(Matrix::MatrixChain()) { Matrix::Traceback(1,W,s); cout<<endl; return true; } return false; } return false; } //一、直接递归解题算法,时间复杂度为O(n3) int Matrix::RecurMatrixChain(int i,int j) { if(i==j) return 0; int u=Matrix::RecurMatrixChain(i,i)+Matrix::RecurMatrixChain(i+1,j)+p[i-1]*p[i]*p[j]; s[i][j]=i; for(int k=i+1;k<j;k++) { int t=Matrix::RecurMatrixChain(i,k)+Matrix::RecurMatrixChain(k+1,j)+p[i-1]*p[k]*p[j]; if(t<u) { u=t; s[i][j]=k; } } return u; } bool Matrix::Recur() { if(Matrix::Input()) { Matrix::RecurMatrixChain(1,W); Matrix::Traceback(1,W,s); cout<<endl; return true; } return false; } //二、备忘录方法 int Matrix::LookupChain(int i,int j) { if(m[i][j]>0) return m[i][j]; if(i==j) return 0; int u=LookupChain(i,i)+LookupChain(i+1,j)+p[i-1]*p[i]*p[j]; s[i][j]=i; for(int k=i+1;k<j;k++) { int t=LookupChain(i,k)+LookupChain(k+1,j)+p[i-1]*p[k]*p[j]; if(t<u){ u=t;s[i][j]=k;} } m[i][j]=u; return u; } int Matrix::MemorizedMatrixChain() { for(int i=1;i<=W;i++) for(int j=1;j<=W;j++) m[i][j]=0; return Matrix::LookupChain(1,W); } void Matrix::Memorized() { if(Matrix::Input()) { Matrix::MemorizedMatrixChain(); Matrix::Traceback(1,W,s); cout<<endl; } } int main() { Matrix m; m.Memorized(); getchar(); getchar(); }

 

 

别人的是以工程的形式存的,dev下我是第一次建立工程

//main.cpp #include "Matrix.h" #include<iostream> using namespace std; int main() { Matrix m; m.Run(); getchar(); getchar(); }

 

//Matrix.h #ifndef MATRIX_H #define MATRIX_H class Matrix { public: Matrix(); //构造函数 ~Matrix(); //析构函数 bool Run(); //运行接口函数 private: int W; //记录矩阵的个数 int **m; //存放最优值,即最小运算量 int **s; //断开位置 int *p; //存放 bool Input(); //处理输入 bool MatrixChain();//计算最优值算法 void Traceback(int i,int j,int **s); //输出矩阵加括号的方式 }; #endif

 

 

//Matrix.cpp #define N 50 #include <iostream.h> #include <stdlib.h> #include "Matrix.h" //构造函数,作变量初始化工作,为指针分配内存空间 Matrix::Matrix() { W=0; m = new int*[N]; s = new int*[N]; for(int i=0; i<N ; i++) { m[i] = new int[N]; s[i] = new int[N]; } p = new int[N]; } //析构函数,释放内存 Matrix::~Matrix() { for(int i=0; i<N ; i++) { delete []m[i]; delete []s[i]; } delete []m; delete []s; delete []p; } //处理键盘输入 bool Matrix::Input() { int w; cout<<"矩阵个数:"; cin>>w; W = w; cout<<"输入矩阵A1维数"<<":"; cin>>p[0]>>p[1]; for(int i=2 ; i<=W ; i++) { int m = p[i-1]; cout<<"输入矩阵A"<<i<<"维数:"; cin>>p[i-1]>>p[i]; if(p[i-1] != m) { cout<<endl<<"维数不对,矩阵不可乘!"<<endl; exit(1); } //cout<<endl; } if(p!=NULL) return true; else return false; } //计算最优值算法 bool Matrix::MatrixChain() { if(NULL == p) return false; for(int i=1;i<=W;i++) m[i][i]=0; for(int r=2;r<=W;r++) for(int i=1;i<=W-r+1;i++) { int j=i+r-1; m[i][j] = m[i+1][j] + p[i-1]*p[i]*p[j]; 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; } } } return true; } //输出矩阵结合方式,加括号 void Matrix::Traceback(int i,int j,int **s) { if(i == j) { cout<<"A"<<i; } else if(i+1 == j) { cout<<"(A"<<i<<"A"<<j<<")"; } else { cout<<"("; Traceback(i,s[i][j],s); Traceback(s[i][j]+1,j,s); cout<<")"; } } bool Matrix::Run() { if(Matrix::Input()) { if(Matrix::MatrixChain()) { Matrix::Traceback(1,W,s); cout<<endl; return true; } else return false; } else return false; }

你可能感兴趣的:(矩阵连乘)