矩阵连乘

题目:给定 n 个矩阵 hA 1 ,A 2 ,…,A n i, 其中 A i 和 A i+1 是可乘的, i = 1,2,…,n − 1. 考虑这 n 个矩阵的连乘积 A 1 × A 2 × ··· × A n 的计算方法?

首先可以暴力枚举,列举所有矩阵连乘的方法所需要的计算量,然后选出最小的那个一个,但是矩阵连乘的方法数很大,可以通过p2函数进行计算,见下列代码。
计算矩阵连乘的方法数的公式为:

int p2(int num)//num为矩阵个数
{if(num==1){return 1;}else{int sum=0;for(int i=1;i<num;i++){sum+=p2(i)*p2(num-i);}return sum;}
}

然后通过分析可以发现,矩阵连乘问题,一系列矩阵连乘中的最优解包含了子问题的最优解,也就是说A1A2…An的最优解中Ai*…Aj(其中i>1,j<n)一定是最优解,因此可以利用动态规划来解决。

动态规划则需要推导公式,矩阵连乘的公式为:
其中A表示矩阵,m[i,j]表示矩阵i乘到矩阵j的最小的计算量,
s[i,j]表示矩阵i乘到矩阵j确定最优解时对应的k值,k值则表示以第k个矩阵为分隔进行矩阵乘法。
p[i]表示矩阵的列数,p[0]表示第1个矩阵的行数。
首先按照矩阵的规模进行枚举,矩阵乘法规模从2变化到n,然后按照公式计算m[i][j]的值。
输出的时候使用递归进行输出。

完整代码

#include<iostream>
#include<cstring>
using namespace std;
int n;
const int size =100;
int maxm =10000000;
int p[size];//用来存储矩阵的阶数
int m[size][size];//计算Aij的最小代价
int s[size][size];//存储最优的k值
void matrixchain()
{memset(m,0,sizeof(m));memset(s,0,sizeof(s));//枚举矩阵的规模for(int r=2;r<=n;r++){for(int i=1;i<=n-r+1;i++){int j=i+r-1;m[i][j]=maxm; for(int k=i;k<j;k++){int tem =m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];if(tem<m[i][j]){m[i][j]=tem;s[i][j]=k;}}}}
}void print(int i,int j)
{if(i == j){cout<<"A["<<i<<"]";return;}cout<<"(";print(i,s[i][j]);print(s[i][j]+1,j);//递归1到s[1][j]cout<<")";
}//计算矩阵连乘的方法数
int p2(int num)
{if(num==1){return 1;}else{int sum=0;for(int i=1;i<num;i++){sum+=p2(i)*p2(num-i);}return sum;}
}int main()
{//int su=p(4);//cout<<su<<endl;cout<<"请输入矩阵的个数n : "<<endl;cin>>n;int i,j;cout<<"请依次输入每个矩阵的行数和最后一个矩阵的列数:"<<endl;for(i=0;i<=n;i++)cin>>p[i];matrixchain(); print(1,n);cout<<endl;cout<<"最小计算量的值为:"<<m[1][n]<<endl;return 0;
}

动态规划(一)——矩阵连乘相关推荐

  1. 动态规划之矩阵连乘讲解

    注:当时在学矩阵连乘的时候,在网上发现这篇文章总结的不错,便摘抄了下来,今天与大家共享.同时望原创不要见怪! 动态规划之矩阵连乘 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i= ...

  2. python连乘函数_动态规划之矩阵连乘问题Python实现方法

    本文实例讲述了动态规划之矩阵连乘问题Python实现方法.分享给大家供大家参考,具体如下: 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i=1,2 ,-,n-1.如何确定计算矩阵 ...

  3. 动态规划实现矩阵连乘

    动态规划实现矩阵连乘积: 用动态规划法解矩阵连乘积的最优计算次序问题. 1.分析最优解结构:     设计求解具体问题的动态规划算法的第一步是刻画该问题的最优解结构特征.首先,为方便起见,将矩阵连乘积 ...

  4. 动态规划解决矩阵连乘问题

    动态规划解决矩阵连乘问题 文章目录 动态规划解决矩阵连乘问题 动态规划 1.要素 2.基本思想 3.适用于解最优化问题步骤 一.矩阵连乘问题 规则 矩阵可乘的条件 计算的次序对计算量的影响 二.动态规 ...

  5. 动态规划:矩阵链连乘问题

    动态规划之矩阵连乘问题 矩阵链乘问题简单而言,便是给定n个矩阵{A1,A2--An},其中Ai与Ai+1是可乘的,考察其连乘时进行计算的最小次数. 在计算过程中,不同的加括号方式对于整个计算量有不一样 ...

  6. 【史上最详细】动态规划:矩阵连乘问题(C++实现,含备忘录方法)

    动态规划与分治法的异同: 相同点:其基本思想都是将待求解问题分解为若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解. 差异点:与分治法不同的是,适合用动态规划法求解的问题经分解得到的子问题 ...

  7. 【算法】几个数组拆分题的算法(动态规划,矩阵递归和同余问题)

    鸽了几个月,终于更了哈哈哈(确实本人懒癌晚期,往往就不更了) 这个学期虽然算是最鸽的一个学期,不过也有些东西,总共一学期做过的三次数组拆分问题感觉上已经够了一篇很不错的文章,其实就有的时候就懒得更了 ...

  8. 【动态规划】矩阵链乘法

    矩阵链乘法    求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积  A1A2...An    为了计算表 ...

  9. 蓝桥杯15届第九题——垒骰子(dfs、动态规划、矩阵)

    前言:该题很值得研究,为什么这么说呢? 题目考查了较多方面的知识点,相信如果将这道题完全理解的话,我们对考查的知识点应用起来会更加得心应手. 下面我会通过三种方式将题目解析透彻,从浅入深. 垒骰子题目 ...

  10. 动态规划之矩阵连乘问题

    目录 矩阵连乘问题简介 举例说明并详细分析 备注 代码块 测试结果 矩阵连乘问题简介1 设计求解具体问题的动态规划算法的第一步是刻画该问题的最优解结构特征.为方便起见,将矩阵连乘积A(i)A(i+1) ...

最新文章

  1. 单击GridView控件,高亮单击所在的记录行
  2. python绘图实例-Python matplotlib基础绘图函数示例
  3. Django中配置静态文件路径
  4. python教程:深copy浅copy
  5. 8天 = 4万元奖金 + CNCC参会资助 | 2019科研文本理解比赛
  6. 关于Linux你了解多少?Linux由来!
  7. vue2.0移除或更改的一些东西
  8. hashset java_Java HashSet clear()方法与示例
  9. SpringMVC中异常捕获
  10. iOS毛玻璃效果(第一次写~有点紧张喔)
  11. 机器学习sklearn中决策树模型参数释义
  12. SpringMVC中请求的转发和重定向
  13. 11001-软件架构设计风格及visio使用
  14. [SQL]数据分析SQL笔试题
  15. Linux内核源代码 学习笔记
  16. 计算机visio流程图,系统流程图和Visio
  17. 苹果手机计算机怎么放桌面,苹果手机桌面图标怎么随意摆放 iPhone桌面图标随意摆放教程 (全文)...
  18. 修改RAC中的私网地址导致CRS启动失败
  19. HBase Shell 命令
  20. vr云游全景展示,用一部手机看遍各大景区

热门文章

  1. php 滑块 爬虫_php中强大爬虫工具querylist
  2. obj 格式3D模型转 gltf 格式
  3. log4j的日志级别以及配置
  4. 计算机无法上网修复工具,lsp怎么修复解决上不了网问题汇总
  5. PI系统在DCS中的应用
  6. IT系统对接方案汇总
  7. matlab 蜗杆轮廓,基于MATLAB的直廓环面蜗杆的可视化
  8. js封装ajax方法
  9. 项目管理十大知识领域之项目沟通管理
  10. linux不同版本编译,嵌入式ARM+Linux 多个不同版本的交叉编译器的切换方法