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

一、实验目的及要求:
实验目的:本实验主要清楚动态规划法的主要思想,如何利用动态规划算法解决实际问题,通过动态规划法求解矩阵连乘问题,利用测试数据对矩阵连乘问题进行求解,得出最终结果,清楚动态规划算法解决问题的主要思路。
实验要求:利用Dev C++编程环境,采用若干个测试数据进行求解,输出矩阵连乘最小乘的次数结果值。
二、实验原理(图):
动态规划是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,用时往往少于朴素解法。思路基本上为:解其不同部分(即子问题),再合并子问题的解以得出原问题的解。通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量。把动态规划中的状态抽象成一个点,在有直接关联的状态间连一条有向边,状态转移的代价就是边上的权。这样就形成了一个有向无环图AOE网。对这个图进行拓扑排序,删除一个边后同时出现入度为0的状态在同一阶段。这样对图求最优路径就是动态规划问题的求解。
三、实验设备(环境):
硬件windows 10 ,软件:DEV。

四、实验内容(算法、程序、步骤和方法):
#include
using namespace std;
#define SIZE 100
void MatrixFun ()
{
int n,p[SIZE],m[SIZE][SIZE];
cin>>n;
memset (m,0x7f,sizeof(m));
for(int i=0;i<=n;i++) cin>>p[i];
for(int i=0;i<=n;i++) m[i][i]=0;
for(int r=2;r<=n-r;r++)
for(int i=0;i<=n-r;i++)
{
int j=i+r-1;
for (int k=i;k<=j-1;k++)
{
int temp;
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;
}
}
cout<<m[0][n-1]<<endl;
}
p表示存放的各个矩阵的行列值,n是从p0到pn ,把最小乘的次数放在m中,输入一个n,m初始化最大值,在里面用for循环,输入p0到pn,再用for循环做边界,先赋值为0,燃后依次动态规划去求解。当r=2,表示两两矩阵相乘的最优次数,当r=3时,表示三矩阵相乘,以此类推,直到n-r个矩阵。在i和j之间从第k个矩阵断开进行相乘的最小乘法次数,把最小值赋给m[i][j],循环完之后输出数值。
int main()
{
MatrixFun();
system(“pause”);
return 0;
}主函数测试代码。
五、实验结论(结果):
输入的文本有两行,
第一行为一个整数n,表示n个矩阵相乘
第二行为n+1个整数,每一个整数表示矩阵的行列值。
输出一个整数,表示矩阵相乘的最小乘法次数。

如下图所示为输出结果

六、实验心得与小结:
做这个实验,我首先想到的是用枚举法,算出每一种加括号情况下的计算量,取最小的情况。工程之庞大可想而知。溯其源,会发现,"枚举“的这种想法是不可避免的,只有所有情况都考虑比较后,才会出现那个最小量乘的结果。普通的枚举导致庞大工程的一个重要因素就是”子问题重复计算“。这里先要明确,什么是矩阵连乘的子问题。我发现了两个有意思的现象:第一,假如你已计算出段长为3的子问题的最优次序,那该最优次序下的子问题也是最优的(你可以通过反证法获知);第二,计算完段长为2的子问题,再计算段长为3的子问题时,你还会用到段长为2的子问题的计算结果,那何不把先前的计算结果进行保存,避免重复计算。

动态规划法解决矩阵连乘问题相关推荐

  1. 算法设计与分析--01背包问题(动态规划法解决)

    算法设计与分析--01背包问题(动态规划法解决) 参考文章: (1)算法设计与分析--01背包问题(动态规划法解决) (2)https://www.cnblogs.com/2228212230qq/p ...

  2. 深度搜索—-深度搜索解决矩阵搜索问题(水洼数计算)

    深度搜索--深度搜索解决矩阵搜索问题(水洼数计算) 一.题目 有一个大小为N*M的园子,雨后积起了水.八连通的计税被认为是连接在一起的.请求出园子里总共有多少水洼? (八连通指的是下图中相对w的*的部 ...

  3. Python解决矩阵的PLU分解及求矩阵的逆

    Python解决矩阵的PLU分解及求矩阵的逆 关于PLU的分解基础知识就不叙述了,可以自己去看矩阵分析的书,大体上和高斯消去法差不多. PLU分解被经常用在Ax=bAx=bAx=b的求解上 在这里xx ...

  4. 分治法解决矩阵乘法问题

    分治法解决矩阵乘法问题 传统for循环: #include<iostream> #include<cstdio> #include <vector> #includ ...

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

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

  6. C语言动态规划法解决0/1背包问题(详细解答)

    动态规划法解决0/1背包问题(详细解答) 首先让我们回顾一下动态规划法的使用规则: 一..动态规划法的实现思路: 1.划分子问题:将元问题分解为若干个子问题,每一个子问题对应一个决策,并且子问题之间具 ...

  7. python动态规划解决矩阵连乘

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

  8. 动态规划法解决的问题

    近似串匹配问题 代码如下: int min(int a,int b,int c){int t;if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;} retu ...

  9. 利用循环解决矩阵nan值(错误解决)

    做的算法里面矩阵经常会出现nan,每一列的值也要求不一样,所以尝试利用循环解决一下问题. try 1 :for 里面用a(isnan(a))=b a=[nan nan nan;1 1 1;0 0 0] ...

最新文章

  1. SAP WM中阶之存储类型设置界面里的’Return Stock To Same Storage Bin’
  2. unity 批量导入模型工具_如何将VMD舞蹈导入桌面萌娘MMD
  3. java中contains的用法_java容器中所有接口和类的用法
  4. 使用Javascript / jQuery下载文件
  5. VMware pro 14
  6. MATLAB 图像伪彩色处理
  7. 如何用计算机函数计算房租,Excel商铺租金模板,租金每两年递增5%,具备收租期、租赁起止期、单价函数自动计算功能...
  8. java实现网站paypal支付功能并且异步修改订单的状态
  9. MusicStore-1 Code First 通过非迁移实现建立数据库
  10. 8位并行左移串行转换电路_单片机试题
  11. 随手记 第1篇 | 笔记本win10 Edge 如何滚动截屏
  12. Hadoop是什么?基本概念
  13. 数据学习(十四)-方差分析与试验设计
  14. model.parameters()的理解与使用
  15. [摘]四十二天学会英语的模范短文和经典100句
  16. java 实现SocketIo客户端
  17. 如何查看ActiveX控件的UUID?
  18. 中兴通讯三位元老级副总裁辞职 或与违规有关
  19. 如何修改游戏服务器,怎样修改游戏服务器
  20. Object——多态与继承

热门文章

  1. 热火的智能投顾,在中国也许只是附庸的命
  2. 浅析std::string的append方法
  3. 上海往事之带娃游泳有惊无险
  4. 策略模式(Strategy Pattern)
  5. 虚拟机中Linux系统gcc代码编程及运行(超超超超级详细)基础篇
  6. CSS实现比翼双飞和圣杯布局模型效果
  7. Java、判断元音还是辅音
  8. 2019中国国际教育展(北京)博览会
  9. ASP.NET 2.0揭秘(中文版)国庆献礼
  10. 图像处理(二)——图像频域滤波