问题描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。例如:A1={30x35} ; A2={35x15} ;A3={15x5} ;A4={5x10} ;A5={10x20} ;A6={20x25} 最后的结果为:((A1(A2A3))((A4A5)A6))  最小的乘次为15125。

解题思路:能用动态规划的一个性质就是最优子结构性质,也就是说计算A[i:j]的最优次序所包含的计算矩阵子琏A[i:k]和A[k+1:j]的次序也是最优的。动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算(即先从最小的开始计算)。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法。我们可以根据下面这个公式来计算结果。其中p[i-1]表示的是第i个矩阵的行数,p[k]表示i:k矩阵合起来后最后得到的列数,p[j]是k+1:j合起来后得到的列数。这个部分的计算方法其实就是计算两个矩阵相乘时总共的乘次数。

从连乘矩阵个数为2开始计算每次的最小乘次数m[i][j]: m[0][1] m[1][2] m[2][3] m[3][4] m[4][5]  //m[0][1]表示第一个矩阵与第二个矩阵的最小乘次数

然后再计算再依次计算连乘矩阵个数为3:m[0][2] m[1][3] m[2][4] m[3][5]
            连乘矩阵个数为4:m[0][3] m[1][4] m[2][5]
          连乘矩阵个数为5:m[0][4] m[1][5]
          连乘矩阵个数为6:m[0][5]    //即最后我们要的结果

#include<stdio.h>
int p[101],m[101][101],s[101][101];
int n;
void matrixChain()
{for(int i=1;i<=n;i++)m[i][i]=0;for(int r=2;r<=n;r++)for(int i=1;i<=n-r+1;i++){int j = r+i-1;          m[i][j]=m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];s[i][j]=i;  for(int k = i+1;k<j;k++){int temp=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];if(temp<m[i][j]){m[i][j]=temp;              s[i][j]=k;}}}
}void traceback(int i,int j)
{if(i==j)return ;traceback(i,s[i][j]);traceback(s[i][j]+1,j);printf("Multiply A[%d,%d]and A[%d,%d]\n",i,s[i][j],s[i][j]+1,j);
}int main()
{while(~scanf("%d",&n)){for(int i=0;i<=n;i++)scanf("%d",&p[i]);matrixChain();traceback(1,n);printf("%d\n",m[1][n]);}return 0;
}

动态规划——矩阵连乘(算法设计课题)相关推荐

  1. 动态规划——最长公共子序列(算法设计课题)

    问题描述: 若给定序列X={x1,x2,-,xm},则另一序列Z={z1,z2,-,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,-,ik}使得对于所有j=1,2,-,k有:zj=xi ...

  2. 回溯子集树与排列树——装载问题旅行售货员问题(算法设计课题)

    *对回溯法不是很理解的请移步博客http://blog.csdn.net/sm9sun/article/details/53244484 掌握了回溯法以后,我们给出两种定义: 当所给问题是从n个元素的 ...

  3. ReviewForJob——算法设计技巧(贪婪算法+分治算法+动态规划)

    [0]README 1)本文旨在介绍算法设计技巧包括 贪婪算法.分治算法.动态规划 以及相关的荔枝等: [1]贪婪算法 1)intro: 贪婪算法是分阶段进行的,在每个阶段,可以认为所做的决定是最好的 ...

  4. 算法设计与分析python_Python算法设计与分析

    内容提要 本书内容包括算法初步.排序算法.查找.双指针问题.哈希算法.深度优先搜索算法.广度优先搜索算法.回溯算法.动态规划.贪心算法.分治算法.并查集.最短路径算法和数论算法等常见算法.每个算法都做 ...

  5. 7、算法设计(基础)

    算法设计 算法设计:迭代.穷举搜索.递推.递归.回溯.贪心.动态规划.分治等算法设计. 在算法设计中,主要考查动态规划法.分治法.回溯法.递归法.贪心法. 1. 算法特性 算法有一些基本特性要求掌握, ...

  6. c++矩阵连乘的动态规划算法并输出_「Javascript算法设计」× 动态规划与回溯算法...

    目录: 分而治之算法 动态规划 回溯算法 分而治之算法 分而治之算法是算法设计的一种方式,它将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将解决方式合并以解决原来的问题(例如快速排序,二分 ...

  7. 算法设计与分析——动态规划(一)矩阵连乘

    动态规划--Dynamic programming,可以说是本人一直没有啃下的骨头,这次我就得好好来学学Dynamic programming. OK,出发! 动态规划通常是分治算法的一种特殊情况,它 ...

  8. 算法分析与设计-实验二 动态规划算法设计

    文章目录 1. 数字三角问题 2.最长公共子序列问题 3.日常购物 4.台阶问题 一.实验目的: 掌握动态规划算法的基本思想及适用条件,掌握动态规划算法的设计步骤和具体实现. 二.实验所用仪器及环境 ...

  9. 算法设计之—直接 遍历/穷举法、贪心算法、动态规划、回溯法、EM方法

    算法是对完成特定问题的程序执行序列描述,表象为从问题初始状态到问题结束状态的所有路径之中寻找可行路径,若无先验经验,根据执行方式不同可以划分为无规则和有规则(启发式)方法. 无规则方法为穷举,改进方法 ...

最新文章

  1. 精通Server Core系列之一 ---Server Core简介
  2. spring boot 学习(二)spring boot 框架整合 thymeleaf
  3. php this 代表什么,php中$this-是什么意义
  4. reservation for talk at Stanford
  5. WACV 2021 论文大盘点 目标检测与图像分割篇(持续更新)
  6. 20应用统计考研复试要点(part22)--简答题
  7. 王者归来!华为P40 Pro渲染图曝光:后置矩阵徕卡五摄模组
  8. 关系数据库、NoSQL和NewSQL数据库产品分类
  9. MySQL外键的三种关系
  10. Redis和Memcache和MongoDB简介及区别分析(整理)
  11. 4.5Python数据处理篇之Matplotlib系列(五)---plt.pie()饼状图
  12. 完美卸载SQL Server2014数据库
  13. c语言-背包问题贪心算法
  14. java pdf添加图片_java pdf指定位置插入图片?
  15. vue实现非同源图片的下载功能--跨域问题(解决浏览器打开图片,而不是下载)
  16. 今天起,上海用户可以用滴滴App免费打无人车了
  17. Cannot build artifact ‘SSM模板+登录注册:war exploded‘ because it is included into a circular dependency (a
  18. Canvas笔触调整-8
  19. 解决安装 ISE14.7 Windows10 时出错
  20. iOS UIButton 图标与标题位置调整

热门文章

  1. 51 FI配置-财务会计-固定资产-折旧-维护期间控制方法
  2. C语言 memcpy函数(增加dst 从第一字节拷贝判断)的内部简单实现方式
  3. 取某个字段的前几位 php,php如何实现截取前几个字符
  4. 打印机测试图_INTAMSYS高温PEEK 3D打印机助力智能组件创新制造
  5. 计算机软件不是出租的主要标的时著作权,著作权中出租权的适用对象有哪些?...
  6. 链路聚合_配置EthTrunk链路聚合
  7. 剖析Caffe源码之Blob
  8. 深度残差收缩网络:(六)代码实现
  9. 如何解决IE6双边距问题?
  10. 代挂系统去授权, 支持燃鹅代抽,安全无后门