动态规划的理论性和实践性都比较强,一方面需要理解状态、状态转移、最优子结构、重叠子问题等概念,另一方面又需要根据题目的条件灵活设计算法。

动态规划是一种用途很广的问题求解方法。它本身并不是一个特定的算法,而是一种思想,一种手段。

动态规划算法与分治法类似,其基本思想也是将待求解问题分解为若干个子问题。

在分解时,得到的子问题往往不是互相独立的,不同子问题的数目常常只有多项式量级。

在用分治法求解时,有些子问题被重复计算了许多次。

如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。

动态规划基本步骤:

1、找出最优解的性质,并刻画其结构特征。

2、递归的定义最优值。

3、以自底向上的方式计算最优值。

4、根据计算最优值时得到的信息,构造最优解。

动态规划算法产用于求解具有某种最优性质的问题。

可能会有许多可行解,希望找到具有最优解的那个解。

矩阵连乘问题。

给定n个矩阵, 其中与是可乘的,考察这n个矩阵的连乘积

计算矩阵的连乘可以有许多不同的计算次序。

输入:矩阵的个数n。矩阵的行数与列数(去除重复)

输出:最少的数乘次数、最优解的方案,即Ai与Aj矩阵相乘,在k位置中断,输出i,k,k+1,j。

计算矩阵的连乘可以有许多不同的计算次序。不同的计算次序对应一种矩阵连乘的完全加括号的方式。

若一个矩阵连乘积的计算次序完全确定,即连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算矩阵连乘积

完全加括号的矩阵连乘递归定义:

(1)单个矩阵是完全加括号的;

(2)矩阵连乘积A是完全加括号的,则A可

表示为2个完全加括号的矩阵连乘积B 和C

的乘积并加括号,即A=(BC)

给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。

穷举法:列举出所有可能的计算次序,并计算出每一种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。

用这种方法时间复杂度太高了,不采用。

怎么用动态规划的方法来解决这个问题呢?

将矩阵连乘积AiAi+1…Aj简记为A[i:j],这里i <= j

考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,i <=k <=j,则其相应完全加括号方式为

计算量:A[i:k]的计算量加上A[k+1:j]的计算量,再加上A[i:k]和A[k+1:j]相乘的计算量。

动态规划算法的第一步:刻画问题的最优解结构特征。

特征:计算A[i:j]的最优次序所包含的计算矩阵子链A[i:k]和A[k+1:j]的次序也是最优的。

矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。

问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。

步骤二:建立递归关系。

设计算A[i:j],1<=i<=j<=n,所需要的最少数乘次数为m[i,j],则原问题的最优值为m[1,n]

当i=j时,A[i:j]=Aj,因此,m[i,i]=0,i=1,2,…n

当i

于是可以递归的定义m[i,j]为:

k的位置只有j-i种可能(最后一个在j-1处)。

注意:m[i,j]给出了最优值,同时确定了最优次序中的断开位置k:

m[i,j] =m[i,k] + m[k+1,j]  + pi-1pkpj

若将对应于m[i,j]的断开位置k记为s[i],在计算最优值m[i,j]后, 可由s[i,j]构造出相应的最优解。

步骤三:计算最优值。

i,j可以相等,有n种情况。

由此可见,在递归计算时,许多子问题被重复计算多次。这也是该问题可用动态规划算法求解的又一显著特征

用动态规划算法解此问题,可根据其递归式以自底向上的方式进行计算。

在计算过程中,保存已解决的子问题答案,每个子问题只计算一次。

而在后面需要子问题的解时只要简单的查一下,从而避免大量的重复计算,最终得到多项式时间的算法。

代码实现下一篇再讲。

矩阵连乘问题算法思想_动态规划-矩阵连乘问题(一)相关推荐

  1. Algorithms_算法思想_递归分治

    文章目录 引导案例 递归的定义 什么样的问题可以用递归算法来解决 递归如何实现以及包含的算法思 递归的公式 斐波那契数列代码实现 递归的时间复杂度和空间复杂度 递 与 归 递归的优化 优化方式一:不使 ...

  2. python矩阵旋转函数_Python3算法之十:矩阵旋转

    关注微信公众号"酸痛鱼",获得更多最新最全的文章. 本文中所涉及的代码,在未特殊声明的情况下,都是基于Python3程序设计语言编写的. 建议您在PC浏览器中阅读本文,以获得更好的 ...

  3. 矩阵连乘问题算法思想_AI自然语言处理算法岗常见面试题(一)

    从隐藏层到输出的Softmax层的计算有哪些方法? 层次softmax 负采样 层次softmax流程? 构造Huffman Tree 最大化对数似然函数输入层:是上下文的词语的词向量投影层:对其求和 ...

  4. 【数据结构与算法】【算法思想】动态规划

    贪心算法 回溯算法 分治算法 动态规划 贪心:一条路走到黑,就一次机会,只能哪边看着顺眼走哪边 回溯:一条路走到黑,无数次重来的机会,还怕我走不出来 (Snapshot View) 动态规划:拥有上帝 ...

  5. 刷题学习—算法思想(动态规划下)

    24.买卖股票的最佳时机系列 24.1买卖股票的最佳时机 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计一个算法来计算你所能获取的最大利润. 只能一笔交易 cla ...

  6. java实现多边形游戏问题_动态规划-多边形游戏

    算法思想:动态规划 实际问题:多边形游戏 编写语言:Java 前言 多边形游戏问题是矩阵连乘的最优计算次序问题与凸多边形最优三角剖分问题的推广.我在解决凸多边形最优三角剖分问题时偶然间看到了这个结论, ...

  7. java动态规划 硬币_动态规划-硬币问题

    算法思想:动态规划 实际问题:硬币问题 编写语言:Java 问题描述 假设有 1 元,3 元,5 元的硬币若干(无限),现在需要凑出 n 元.问如何组合才能使硬币的数量最少? 关键特征 要推出问题的关 ...

  8. java矩阵连乘_算法设计与分析——矩阵连乘问题(动态规划)

    一.问题描述 引出问题之前我们先来复习一下矩阵乘积的标准算法. int ra,ca;//矩阵A的行数和列数 int rb,cb;//矩阵B的行数和列数 voidmatrixMultiply() {fo ...

  9. 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...

    矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率. 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3) 也称 ...

最新文章

  1. 计算机数值方法期末考试,《计算机数值方法》测试题二
  2. python 利用numpy进行数据分析
  3. SLAM学习--常用数据集
  4. verilog 移位运算符 说明_FPGA、数字IC系列(2)——电子科大与北航部分Verilog题目与解析...
  5. php mysql防卡_php mysql防止sql注入详解
  6. 如何优雅处理 async await 错误——解读小而美的 await-to-js 库
  7. Python 3 报错 TypeError: object() takes no parameters【新手必过坑之一】
  8. LeetCode 1745. 回文串分割 IV(区间DP)
  9. html json to table,javascript - HTML - Convert json to table - Stack Overflow
  10. Notepad++ 经常使用快捷键 (MEMO)
  11. centos6 升级openssh7.0
  12. 从ini文件里面读取配置文件
  13. 开源与安全兼备 IBM LinuxONE轻松掌控关键业务
  14. 2022.4.7网页一直在加载中,无提示
  15. postgresql用户和角色
  16. 正则表达式去除空格、符号,只保留中文、英文、数字
  17. 网易公开课——可汗学院公开课:现代密码学(1)
  18. Tableau豆瓣电影数据项目实战练习2
  19. win7计算机iis,Win7系统怎么打开iis功能?Win7系统打开iis功能的方法
  20. Java内存模型和常见的内存溢出类型及解决方案

热门文章

  1. SegNet-论文笔记-理解
  2. 使用XDoclet生成代码
  3. 并联串联混合的电压和电流_混合断路器会成为高压直流电网故障清除的新出路吗?...
  4. c语言对数组求秩,怎样用C语言求矩阵的秩
  5. 帆软填报通过JS清空数据库表
  6. React:后端返回pdf数据流,前端打开页面预览,使用fetch,PDFObject
  7. 入门任务1-PPCA
  8. android 对数标度 图库,对数标度
  9. 51单片机C语言code定义,51单片机数组的定义方法(code与data的作用)
  10. 识别人脸伪装 仅看眼睛和嘴巴就能识别一半