动态规划实现矩阵连乘
动态规划实现矩阵连乘积:
用动态规划法解矩阵连乘积的最优计算次序问题。
1.分析最优解结构:
设计求解具体问题的动态规划算法的第一步是刻画该问题的最优解结构特征。首先,为方便起见,将矩阵连乘积Ai...Aj
简记为A[i:j]。考查A[1:n]的最优计算次序。设这个最优计算次序在矩阵Ak和A(k+1)之间将矩阵链断开,1<=k<n,则其对应的
完全加括号方式为((A1...Ak)(A(k+1)...An))。即依此次序,先计算A[1:k]和A[k+1:n],然后将计算结果相乘得到A[1:n]。依
此计算次序,总共计算量为A[1:k]的计算量加上A[k+1:n]的计算量,再加上A[1:k]和A[k+1:n]相乘的计算量。
2.建立递归关系
对于矩阵连乘积的最优计算次序问题,设计算A[i:j],1<=i<=j<=n,所需的最少数乘次数为m[i][j],则原问题的最优值为m[1][n]。
当i=j时,A[i:j]=Ai为单一矩阵,无需计算,因此m[i][j]=0,i=1,2,...,n。
当i<j时,可利用最优子结构性质计算m[i][j]。事实上,若计算A[i:j]的最优次序在Ak和A(k+1)之间断开,i<=k<j,则m[i][j]=
m[i][k]+m[k+1][j]+p(i-1)*pk*pj。由于在计算时并不知道断开点k的位置,所以k还未确定。不过k的位置只有j-i一种可能,
就是使计算量达到最小的那个位置。也就是说m[i][j]=m[i][k]+m[k+1][j]+p(i-1)*pk*pj。递归地有s[i][j]构造出相应的最优解。
输入参数{p0,p1,...,pn}存储于数组p中,算法除了输出最优值数组m外还输出记录最优断开位置的数组s。
例:要计算矩阵连乘积A1A2A3A4A5A6,其中各矩阵的维数分别为:
A1 A2 A3 A4 A5 A6
30*35 35*15 15*5 5*10 10*20 20*25
#include<stdio.h>#define MaxSize 10void Print(int(*m)[MaxSize], int n)
{for (int i = 1; i <= n; i++){printf("%d\t", i);}for (int i = 1; i <= n; i++){printf("\n%d:", i);for (int j = 1; j <= n; j++){printf("%d\t", m[i][j]);}}printf("\n");
}void MatrixChain(int n, int *p, int (*m)[MaxSize], int (*s)[MaxSize])
{for (int r = 2; r <= n; r++){for (int i = 1; i <= n - 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 < j; k++){int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];if (t < m[i][j]){m[i][j] = t;s[i][j] = k;}}}}
}void TraceBack(int(*s)[MaxSize], int i, int j)
{if (i == j){}else{TraceBack(s, i, s[i][j]);TraceBack(s, s[i][j] + 1, j);printf("Multiply (A%d and A%d),断开位置是:%d\n",i, j,s[i][j]);}return;
}int main()
{int start = 0, end = 0;int p[] = {30,35,15,5,10,20,25};int m[MaxSize][MaxSize] = {};int s[MaxSize][MaxSize] = {};int n = sizeof(p) / sizeof(p[0])-1;MatrixChain(n ,p, m, s);printf("打印m数组:\n ");Print(m, n);printf("打印s数组:\n ");Print(s, n);printf("请输入矩阵连乘的起始位置和终止位置:");scanf_s("%d %d",&start,&end);printf("矩阵连乘从%d开始,到%d结束:\n",start,end);TraceBack(s, start, end);return 0;}
动态规划实现矩阵连乘相关推荐
- 动态规划之矩阵连乘讲解
注:当时在学矩阵连乘的时候,在网上发现这篇文章总结的不错,便摘抄了下来,今天与大家共享.同时望原创不要见怪! 动态规划之矩阵连乘 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i= ...
- python连乘函数_动态规划之矩阵连乘问题Python实现方法
本文实例讲述了动态规划之矩阵连乘问题Python实现方法.分享给大家供大家参考,具体如下: 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i=1,2 ,-,n-1.如何确定计算矩阵 ...
- 动态规划解决矩阵连乘问题
动态规划解决矩阵连乘问题 文章目录 动态规划解决矩阵连乘问题 动态规划 1.要素 2.基本思想 3.适用于解最优化问题步骤 一.矩阵连乘问题 规则 矩阵可乘的条件 计算的次序对计算量的影响 二.动态规 ...
- 动态规划:矩阵链连乘问题
动态规划之矩阵连乘问题 矩阵链乘问题简单而言,便是给定n个矩阵{A1,A2--An},其中Ai与Ai+1是可乘的,考察其连乘时进行计算的最小次数. 在计算过程中,不同的加括号方式对于整个计算量有不一样 ...
- 【史上最详细】动态规划:矩阵连乘问题(C++实现,含备忘录方法)
动态规划与分治法的异同: 相同点:其基本思想都是将待求解问题分解为若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解. 差异点:与分治法不同的是,适合用动态规划法求解的问题经分解得到的子问题 ...
- 【算法】几个数组拆分题的算法(动态规划,矩阵递归和同余问题)
鸽了几个月,终于更了哈哈哈(确实本人懒癌晚期,往往就不更了) 这个学期虽然算是最鸽的一个学期,不过也有些东西,总共一学期做过的三次数组拆分问题感觉上已经够了一篇很不错的文章,其实就有的时候就懒得更了 ...
- 【动态规划】矩阵链乘法
矩阵链乘法 求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积 A1A2...An 为了计算表 ...
- 蓝桥杯15届第九题——垒骰子(dfs、动态规划、矩阵)
前言:该题很值得研究,为什么这么说呢? 题目考查了较多方面的知识点,相信如果将这道题完全理解的话,我们对考查的知识点应用起来会更加得心应手. 下面我会通过三种方式将题目解析透彻,从浅入深. 垒骰子题目 ...
- 动态规划之矩阵连乘问题
目录 矩阵连乘问题简介 举例说明并详细分析 备注 代码块 测试结果 矩阵连乘问题简介1 设计求解具体问题的动态规划算法的第一步是刻画该问题的最优解结构特征.为方便起见,将矩阵连乘积A(i)A(i+1) ...
最新文章
- Zabbix数据库需要多大硬盘
- 大数据背后是个万亿市场
- 获取m,n之间的随机整数
- 【英语学习】【English L06】U06 Banking L1 How can I save money?
- js的跨域问题和解决办法
- rtmp协议 java_rtmp协议详解 (一) handshake
- 组建局域网_组网方案图文教程,双路由器有线搭建网络,公司家庭组建局域网...
- 国际刑警组织来取经,阿里已成中国打假名片
- 熊猫酒仙服务器位置,刀塔传奇里熊猫酒仙全面分析
- 推荐一款非常实用的VR手势插件VRBasics
- python连接sftp下载文件及文件夹
- 求职招聘微信小程序源码下载v4.1.78 修复首页授权空白问题
- 基恩士编程c语言,基恩士xg7000系列.pdf
- TCP Flood攻击实验
- 华为手机的不明照片是哪来的?这几个设置得关闭,否则128G也不够
- VS2015快捷键 修改
- 【IPv6】设置win10和win11允许访问IPv6站点
- Express 框架
- i2c-tools 测试i2c
- Android禁用截屏