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

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

一、实验目的及要求:
实验目的:本实验主要清楚动态规划法的主要思想,如何利用动态规划算法解决实际问题,通过动态规划法求解矩阵连乘问题,利用测试数据对矩阵连乘问题进行求解,得出最终结果,清楚动态规划算法解决问题的主要思路。
实验要求:利用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
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值