• 小学
  • 初中
  • 高中
  • 小升初
  • 中考
  • 高考
  • 英语
  • 考研
  • 四六级
  • 单元
  • 节日
  • 母爱
  • 诚信
  • 父爱
  • 环保
  • 家庭
  • 感动
  • 成长
  • 感恩
  • 梦想
  • 爱国
  • 写景
  • 写人
  • 叙事
  • 状物
  • 议论
  • 说明
  • 抒情
  • 观后感
  • 诗歌
  • 读后感
  • 想象
  • 素材
  • 名言
  • 段落
  • 哲理
  • 诗词
  • 成语
  • 赏析
  • 基础
  • 演练
  • 教学
  • 当前位置: 天一资源网 > 矩阵 正文

    [矩阵连乘问题(动态规划)]矩阵连乘问题求解

    时间:2020-08-06 13:08:45 来源:天一资源网 本文已影响 天一资源网手机站

      矩阵连乘问题(动态规划)

     实验目的与要求

     1、明确矩阵连乘的概念。

     2、利用动态规划解决矩阵连乘问题。

     二、实验题:

     问题描述:

     给定n个矩阵{A1,A2,...,An},其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数。

     三、实验代码

     #include<iostream>

     using namespace std;

     const int MAX = 100;

     //p用来记录矩阵的行列,main函数中有说明

     //m[i][j]用来记录第i个矩阵至第j个矩阵的最优解

     //s[][]用来记录从哪里断开的才可得到该最优解

     int p[MAX+1],m[MAX][MAX],s[MAX][MAX];

     int n;//矩阵个数

     int matrixChain(){

     for(int i=0;i<=n;i++)

     m[i][i]=0;

     for(int r=2;r<=n;r++)//对角线循环

     for(int i=0;i<=n-r;i++){//行循环

     int j = r+i-1;//列的控制

     //找m[i][j]的最小值,先初始化一下,令k=i

     m[i][j]=m[i+1][j]+p[i+1]*p[i]*p[j +1];

     s[i][j]=i;

     //k从i+1到j-1循环找m[i][j]的最小值

     for(int k = i+1;k<j;k++){

     int temp=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1];

     if(temp<m[i][j]){

     m[i][j]=temp;

     //s[][]用来记录在子序列i-j段中,在k位置处

     //断开能得到最优解

     s[i][j]=k;

     }

     }

     }

     return m[0][n-1];//最终结果

     }

     //根据s[][]记录的各个子段的最优解,将其输出

     void traceback(int i,int j){

     if(i==j){

     cout<<'A'<<i;

     return ;

     }

     if(i<s[i][j])

     cout<<'(';

     traceback(i,s[i][j]);

     if(i<s[i][j])

     cout<<')';

     if(s[i][j]+1<j)

     cout<<'(';

     traceback(s[i][j]+1,j);

     if(s[i][j]+1<j)

     cout<<')';

     }

     void traceback(){

     cout<<'(';

     traceback(0,n-1);

     cout<<')';

     cout<<endl;

     }

     int main(){

     cout<<"请输入矩阵的个数:"<<endl;

     cin>>n;

     cout<<"输入矩阵(形如a*b,中间用空格隔开):"<<endl;

     for(int i=0;i<=n;i++)

     cin>>p[i];

     //测试数据可以设为六个矩阵分别为

     //A1[30*35],A2[35*15],A3[15*5],A4[5*10],A5[10*20],A6[20*25]

     //则p[0-6]={30,35,15,5,10,20,25}

     cout<<"输出结果如下:"<<endl;

     matrixChain();

     traceback(0,n-1);

     //最终解值为m[0][n-1];

     cout<<endl;

     return 0;

     }

     ?四、实验结果

    相关关键词: 矩阵乘法 二阶逆矩阵简便算法 一个数乘以一个矩阵 矩阵 matlab解矩阵方程
    相关热词搜索: 矩阵 规划 动态

    • 范文大全
    • 教案下载
    • 优秀作文
    • 励志
    • 课件
    • 散文
    • 名人名言