算法设计与分析--矩阵连乘顺序问题…

 

 #define N 50

 #include

 #include

 

 

 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);   //输出矩阵加括号的方式

 };

 

 

 

 //构造函数,作变量初始化工作,为指针分配内存空间

 Matrix::Matrix()

  {

     W=0;

     m = new int*[N];

     s = new int*[N];

     for(int i=0; i

      {

         m[i] = new int[N];

         s[i] = new int[N];

     }

     p = new int[N];

 }

 

 //析构函数,释放内存

 Matrix::~Matrix()

  {

     for(int i=0; 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

              {

                 int t = m[i][k] m[k 1][j] p[i-1]*p[k]*p[j];

                 if(t

                  {

                     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())

      {

                     cout<<"最佳相乘的顺序为: ";

         if(Matrix::MatrixChain())

          {

             Matrix::Traceback(1,W,s);

             cout<<endl;

             return true;

         }

         else

             return false;

     }

     else

         return false;

 }

 

 

 

 void main()

  {

     Matrix m;

     m.Run();

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值