动态规划简介

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。

矩阵连乘问题的定义

输入:n个矩阵A1,A2,…,An,其中Ai的维数为pi-1×pi
Ai 和Ai+1是可乘的

输出:连乘积A1A2A3…An

优化目标:最小计算代价(最优的计算次序)

矩阵乘法的代价:乘法次数
若A 是p ×q 矩阵,B 是q ×r 矩阵,则A ×B 的代价是pqr
因为矩阵乘法满足结合律,因此矩阵连乘可以由不同的计算次序,这种计算次序可以用加括号来表示。

三个矩阵A1: 10×100, A2: 100×5,A3: 5×50
(A1A2)A3
代价:10×100×5+10×5×50=7500
A1(A2A3)
代价:100×5×50+10×100×50=75000

可见不同的计算次序会导致不同的计算代价,我们要做的就是让这个代价最小。

我们自然可以用穷举法计算每次不同的结合次序带来的不同代价,然后取最小值,但是这样我们得到的复杂度将达到

分析最优解结构

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

设AiAi+1…Aj的最优计算次序在矩阵Ak和Ak+1之间将矩阵链断开得到:(Ai… Ak) (Ak+1 …Aj)

总的计算量就是:A[i:k]的计算量+A[k+1: j]的计算量+A[i:k]和A[k+1:j]相乘的计算量

建立的递归关系就是

计算A[i:j]所需的最小乘法次数为m(i,j)

其中Ai是Pi-1 x Pi的矩阵

接下来我们借助填表过程理解递归的过程,现在给出下列矩阵:


填表过程是按对角线填写的,只利用到了二维数组的右上角一部分。

根据地推公式,我们可以知道,在i=j时m=0,所以先构造出最长的对角线部分的数据,如下图:

现在我们继续构造,
m(1,2)=min{m[1][1]+m[2][2]+p0p1p2}={0+0+303515}=15750

m(2,3) = min(m[2][2]+m[3][3]+p1p2p3=0+0+35155)=2625

同理,后面不再一一列举;

再多说一点,有时我们会遇到有多个划分,我们取最小值就可以了,

例如:m(1,4)=min{m[1][2]+m[3][4]+p0p2p4 或者是 m[1][1]+m[2][4]+p0p1p4或者是m[1][3]+m[4][4]+p0p3p4},其中的值已经在前面求出来了,这也是动态规划要记录所有值的原因。

结果图如下:读者可以自行计算验证。


那么,我们最后如何得知是哪个地方要加括号呢?
根据最后的公式。

例如,假设最后的m[1:6]=m[1,1]+m[2][6]+p0p2p6(笔者构造的,跟上面的例子没关系),那么我们就知道是(A1(A2A3A4A5A6)),再看m[2:6],根据公式找退出括号位置,一直推到最后即可。

我们不难发现,加括号的位置其实就是k 的对应序号的矩阵,在写算法时我们就可以用另外的数组记录下对应位置的k值。在最后输出时把这个数组按逻辑输出。

最终这个算法的复杂度

代码如下:(摘录自:大佬的博客中的代码)

#include<iostream>
using namespace std;
const int N = 100;
int A[N];//矩阵规模
int m[N][N];//最优解
int s[N][N];
void MatrixChain(int n)
{int r, i, j, k;for (i = 0; i <= n; i++)//初始化对角线{m[i][i] = 0;}for (r = 2; r <= n; r++)//r个矩阵连乘{for (i = 1; i <= n - r + 1; i++)//r个矩阵的r-1个空隙中依次测试最优点{j = i + r - 1;m[i][j] = m[i][i]+m[i + 1][j] + A[i - 1] * A[i] * A[j];s[i][j] = i;for (k = i + 1; k < j; k++)//变换分隔位置,逐一测试{int t = m[i][k] + m[k + 1][j] + A[i - 1] * A[k] * A[j];if (t < m[i][j])//如果变换后的位置更优,则替换原来的分隔方法。{m[i][j] = t;s[i][j] = k;}}}}
}
void print(int i, int j)
{if (i == j){cout << "A[" << i << "]";return;}cout << "(";print(i, s[i][j]);print(s[i][j] + 1, j);//递归1到s[1][j]cout << ")";
}
int main()
{int n;//n个矩阵cin >> n;int i, j;for (i = 0; i <= n; i++){cin >> A[i];}MatrixChain(n);cout << "最佳添加括号的方式为:";print(1, n);cout << "\n最小计算量的值为:" << m[1][n] << endl;return 0;
}

动态规划算法的基本要素

适用条件

1.优化子结构
2.重叠子问题

设计步骤

1.找出最优解性质,刻画结构特征

2.递归地定义最优解

3.自底向上的方式计算最优解

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

动态规划之矩阵连乘问题详细解读(思路解读+填表+代码)相关推荐

  1. c语言 - 杨氏矩阵,查找某个数字(思路清晰,代码简洁)(适合刚入坑)

    作者简介:一名大一在校生 个人主页:月亮嚼成星~ 个人WeChat:yx1552029968 系列专栏:c语言刷题总结 每日一句:当暴雨在头顶倾泻时,你只当它是屋檐滴水. 杨氏矩阵 题目: 有一个数字 ...

  2. 使用tensorflow建模LSTM的详细步骤通俗易懂解读

    使用tensorflow建模LSTM的详细步骤人性化解读 一步步条理清晰的写tensorflow代码 Understanding LSTM in Tensorflow(MNIST dataset) L ...

  3. 动态规划之矩阵连乘讲解

    注:当时在学矩阵连乘的时候,在网上发现这篇文章总结的不错,便摘抄了下来,今天与大家共享.同时望原创不要见怪! 动态规划之矩阵连乘 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i= ...

  4. python连乘函数_动态规划之矩阵连乘问题Python实现方法

    本文实例讲述了动态规划之矩阵连乘问题Python实现方法.分享给大家供大家参考,具体如下: 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i=1,2 ,-,n-1.如何确定计算矩阵 ...

  5. 百度地图安卓版详细接入流程解读(获取密钥详解)

    百度地图安卓版详细接入流程解读 一.接入Android地图SDK 1.1 功能介绍: 1.2 接入百度地图前的准备 1.1.1 访问官网,并下载开发包 1.1.2 获取开发密钥 1.1.3 项目环境搭 ...

  6. 基于pytorch搭建多特征CNN-LSTM时间序列预测代码详细解读(附完整代码)

    系列文章目录 lstm系列文章目录 1.基于pytorch搭建多特征LSTM时间序列预测代码详细解读(附完整代码) 2.基于pytorch搭建多特征CNN-LSTM时间序列预测代码详细解读(附完整代码 ...

  7. [原创]目前手把一扑克牌游戏最详细的规则解读

    目前手把一扑克牌游戏最详细的规则解读 原本准备开发一个手把一的扑克牌游戏,要开发扑克牌游戏,必先通晓其规则,结合大学几年的寝室手把一经历写下了较为流行的烟威地区的手把一规则. ㈠简介 手把一是一种两人 ...

  8. 动态规划实现矩阵连乘

    动态规划实现矩阵连乘积: 用动态规划法解矩阵连乘积的最优计算次序问题. 1.分析最优解结构:     设计求解具体问题的动态规划算法的第一步是刻画该问题的最优解结构特征.首先,为方便起见,将矩阵连乘积 ...

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

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

  10. 动态规划:矩阵链连乘问题

    动态规划之矩阵连乘问题 矩阵链乘问题简单而言,便是给定n个矩阵{A1,A2--An},其中Ai与Ai+1是可乘的,考察其连乘时进行计算的最小次数. 在计算过程中,不同的加括号方式对于整个计算量有不一样 ...

最新文章

  1. PlayMaker的特殊事件FINISHED
  2. Navicat设置unique报错
  3. 一些看起来简单做起来难的程序员笔试面试题集锦
  4. Java写一个快速排序_快速排序java实现
  5. 蓝牙学习笔记(八)——BLE 4.0 的128Bits/32Bist/16Bits的UUID
  6. ihttphandler ihttpmodule
  7. 变分模态分解(VMD)原理-附代码
  8. NOIP2017 普及组题解
  9. GPRS网络继电器SAC07GSA评估套件使用心得
  10. c++11原子量atomic
  11. python pdfminer3k_python 使用pdfminer3k 读取PDF文档的例子
  12. LVGL littlevgl使用
  13. 大猫谈JNCIE实验考试备战
  14. 中南大学2019计算机研究生分数线,2019中南大学研究生分数线(含2016-2019历年复试)...
  15. 什么是组态?组态的概念及发展趋势
  16. 解决方案——笔记本HDMI外接2k显示器如何调2k分辨率
  17. 宏基因组分箱CheckM评估结果的提取
  18. 【app开发学习】APP开发的标准流程
  19. 编写程序实现以下功能:计算1~n之间的素数并输出
  20. 匈牙利算法编程c语言,华为oj之素数伴侣---匈牙利算法

热门文章

  1. 基于Matlab App Designer的语音信号分析与处理(三):App的设计
  2. Javc处理图片各种效果的类库Java Image Filters
  3. 【日常技巧】Rufus安装原版win10教程(全流程)
  4. 微信小程序实战之登录页面制作
  5. 微信小程序之登录界面示例
  6. 浅谈JSP编程的网店管理系统构造
  7. 适用于商业的10款最佳Android应用模板
  8. 中国大陆主要银行卡号对应
  9. 解决酷狗音乐缓存文件kgtemp文件无法播放的问题
  10. 项目管理十大知识领域运用流程