【算法分析与设计】动态规划(上)

news2024/11/25 19:15:23

目录

  • 一、学习要点
  • 二、算法总体思想
  • 三、动态规划基本步骤
  • 四、矩阵连乘问题
    • 4.1 完全加括号的矩阵连乘积
    • 4.2 穷举法
    • 4.3 动态规划
      • 4.3.1 分析最优解的结构
      • 4.3.2 建立递归关系
      • 4.3.3 计算最优值
      • 4.3.4 用动态规划法求最优解
  • 五、动态规划算法的基本要素
    • 5.1 最优子结构
    • 5.2 重叠子问题
    • 5.3 备忘录方法
  • 六、思考题:捡硬币问题


一、学习要点

  理解动态规划算法的概念
  掌握动态规划算法的基本要素
  (1)最优子结构性质
  (2)重叠子问题性质

  掌握设计动态规划算法的步骤
  (1)找出最优解的性质,并刻划其结构特征
  (2)递归地定义最优值
  (3)以自底向上的方式计算出最优值
  (4)根据计算最优值时得到的信息,构造最优解

  通过应用范例学习动态规划算法设计策略。
  (1)矩阵连乘问题;
  (2)最长公共子序列;
  (3)最大子段和
  (4)凸多边形最优三角剖分;
  (5)多边形游戏;
  (6)图像压缩;
  (7)电路布线;
  (8)流水作业调度;
  (9)背包问题;
  (10)最优二叉搜索树。


二、算法总体思想

  动态规划算法与分治法类似,其 基本思想也是将待求解问题分解成若干个子问题
在这里插入图片描述
  但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次
在这里插入图片描述
  如果 能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。
在这里插入图片描述


三、动态规划基本步骤

  找出最优解的性质,并刻划其结构特征
  递归地定义最优值
  以自底向上的方式计算出最优值
  根据计算最优值时得到的信息,构造最优解


四、矩阵连乘问题

  问题:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2,…n-1。我们要计算出这 n个矩阵的连乘积
  因为矩阵乘积满足结合律,所以哪两个矩阵先乘哪两个后乘结果是一样的,但是 计算次数不一样,我们要找计算次数最小的那个次序!


4.1 完全加括号的矩阵连乘积

  完全加括号的矩阵连乘积可递归地定义为:
在这里插入图片描述
  设有四个矩阵A,B,C,D;它们的维数分别是:
在这里插入图片描述
  总共有五中完全加括号的方式:
在这里插入图片描述
  16000, 10500, 36000, 87500, 34500

  给定n个矩阵:在这里插入图片描述其中Ai与Ai+1是可乘的,i=1,2,…,n-1。考察这n个矩阵的连乘积在这里插入图片描述
  由于 矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。
  若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积
  给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算 矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少


4.2 穷举法

  列举出所有可能的计算次序,并计算出每一种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。
  算法复杂度分析
  对于n个矩阵的连乘积,设其不同的计算次序为P(n)。
  由于每种加括号方式都可以分解为两个子矩阵的加括号问题:(A1…Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:
在这里插入图片描述


4.3 动态规划

  将矩阵连乘积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]相乘的计算量。


4.3.1 分析最优解的结构

  特征:计算A[i:j]的最优次序所包含的计算矩阵子链 A[i:k]和A[k+1:j]的次序也是最优的
  矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质问题的最优子结构性质是该问题可用动态规划算法求解的显著特征


4.3.2 建立递归关系

  设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n]
  当i=j时,A[i:j]=Ai,因此,m[i,i]=0,i=1,2,…,n
  当i<j时,在这里插入图片描述
在这里插入图片描述
  可以递归地定义m[i,j]为:
在这里插入图片描述
  (k的位置只有j-i种可能)


4.3.3 计算最优值

  对于1≤i≤j≤n不同的有序对(i,j)对应于不同的子问题。因此,不同子问题的个数最多只有在这里插入图片描述
  由此可见,在递归计算时,许多子问题被重复计算多次。这也是该问题可用动态规划算法求解的又一显著特征。
  用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法
在这里插入图片描述
  1.计算A1,A2,A3,A4,A5,A6
  2.计算(A1A2),(A2A3),(A3A4),(A4A5),(A5A6)
  3.计算(A1A2A3),…,(A4A5A6)
  4.计算A[1,4],A[2,5],A[3,6]
  5.计算A[1,5],A[2,6]
  6.计算A[1,6]


4.3.4 用动态规划法求最优解

void MatrixChain(int *p,int n,int **m,int **s)
{
        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=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;}
              }
          }
}

在这里插入图片描述
在这里插入图片描述
  算法复杂度分析
  算法matrixChain的主要计算量取决于算法中对r,i和k的3重循环。循环体内的计算量为O(1),而3重循环的总次数为O(n3)。因此算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)。
在这里插入图片描述


五、动态规划算法的基本要素

5.1 最优子结构

  矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质
  在分析问题的最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾
  利用问题的最优子结构性质,以自底向上的方式 递归地从子问题的最优解逐步构造出整个问题的最优解最优子结构是问题能用动态规划算法求解的前提

  同一个问题可以有多种方式刻划它的最优子结构,有些表示方法的求解速度更快(空间占用小,问题的维度低)


5.2 重叠子问题

  递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质
  动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果
  通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率
在这里插入图片描述


5.3 备忘录方法

  备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。

int LookupChain(int i,int j)
{
       if (m[i][j] > 0) return m[i][j];
       if (i == j) return 0;
       int u = LookupChain(i,i) + LookupChain(i+1,j) + p[i-1]*p[i]*p[j];
       s[i][j] = i;
       for (int k = i+1; k < j; k++) {
         int t = LookupChain(i,k) + LookupChain(k+1,j) + p[i-1]*p[k]*p[j];
         if (t < u) { u = t; s[i][j] = k;}
         }
       m[i][j] = u;
       return u;
}

六、思考题:捡硬币问题

  现有n个硬币按顺序依次排列在你面前,可以看为一个数组coins[]={5,1,2,10,6,2},请在此中捡取若干个硬币,使得所取硬币累加值最大,捡取个数不限,但相邻两个硬币不得捡取,请设计相应算法,并输出累加值
  提示:硬币面值必须是正数,不能有负值。建立数组dp[i]存储选取前i个硬币的累加值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1049542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI项目十一:Swin Transformer训练

若该文为原创文章&#xff0c;转载请注明原文出处。 续上一篇&#xff0c;训练自己的数据集&#xff0c;并测试。 一、安装标注软件labelme # 安装labelme pip install labelme # 启动 labelme 这里数据集准本&#xff0c;标注图片数据过程自己探索。 最后文件结构如下&…

0x2C动态定义数据标识符服务

其实就是临时在指定地址创建个信息DID&#xff0c;里面可以存写临时数据&#xff0c;到时候可以给自己读写&#xff0c;但是这东西一重启或者过段时间就没了。要用0x22服务去读取&#xff0c;0x2A来写&#xff0c;不能用0x2E来写&#xff0c;协议认为0x2E不能指定地址来写。 这…

C++之容器类有趣的实验(二百四十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

处理conda安装工具的动态库问题——解决记录 libssl.1.0.0 系统中所有openssl位置全览 whereis openssl

处理conda安装工具的动态库问题——解决记录 处理conda安装工具的动态库问题——解决记录 - 简书 解决libssl.so.1.0.0: cannot open shared object file: No such file or directory问题 - 简书 openssl 默认版本问题&#xff08;Anaconda相关&#xff09;_anaconda openssl-…

Pikachu-xxe (xml外部实体注入漏洞)过关笔记

Pikachu-xxe过关笔记 有回显探测是否有回显file:///协议查看本地系统文件php://协议查看php源代码&#xff08;无法查看当前网页代码&#xff0c;只能看别的&#xff09;http://协议爆破开放端口&#xff08;两者的加载时间不同&#xff09; 无回显第一步第二步第三步 运行结果…

docker系列(9) - docker-compose

文章目录 9. compose编排9.1 介绍9.2 安装9.3 compose常用命令9.4 编排微服务9.4.1 准备docker-compose.yml9.4.2 启动服务9.4.3 测试验证 9. compose编排 9.1 介绍 多服务部署工具&#xff0c;通过一个docker-compose.yml模板文件&#xff0c;定义一组关联的应用容器为一个项…

Android shape记录

之前一直觉得dataPath很好用&#xff0c;可以画各种矢量图。今天发现用shape画图也不错&#xff0c;记录一下自己用shape画的图。 一般使用shape就是定义形状、stroke边、solid内部、corners圆角等&#xff0c;代码 <?xml version "1.0" encoding "utf-8&q…

数据结构-快速排序-C语言实现

引言&#xff1a;快速排序作为一种非常经典且高效的排序算法&#xff0c;无论是工作还是面试中广泛用到&#xff0c;作为一种分治思想&#xff0c;需要熟悉递归思想。下面来讲讲快速排序的实现和改进。 老规矩&#xff0c;先用图解来理解一下&#xff1a;&#xff08;这里使用快…

【时区】Flink JDBC 和CDC时间字段时区 测试及时间基准

关联文章: 各种时间类型和timezone关系浅析 一、测试目的和值 1. 测试一般的数据库不含time zone的类型的时区。 mysql timestamp(3) 类型postgres timestamp(3) 类型sqlserver datetime2(3) 类型oracle类型 TIMESTAMP(3) 类型 在以下测试之中均为ts字段 2.测试CDC中元数据…

为什么 Go 语言 struct 要使用 tags

在 Go 语言中&#xff0c;struct 是一种常见的数据类型&#xff0c;它可以用来表示复杂的数据结构。在 struct 中&#xff0c;我们可以定义多个字段&#xff0c;每个字段可以有不同的类型和名称。 除了这些基本信息之外&#xff0c;Go 还提供了 struct tags&#xff0c;它可以用…

IPsec_SSL VPN身份鉴别过程简要

一、IPsec VPN身份鉴别&#xff08;参考国密标准《GMT 0022-2014 IPsec VPN技术规范》&#xff09; IKE第一阶段&#xff08;主模式&#xff09; “消息2”由响应方发出&#xff0c;消息中具体包含一个SA载荷&#xff08;确认所接受的SA提议&#xff09;、响应方的签名证书和…

1分钟快速实现Redis数据对比

在上篇「Redis高效、安全的不停机数据迁移方案」的文章中&#xff0c;介绍了NineData在Redis迁移场景下的性能和优势。因为数据在主备、多云和多区域环境之间的迁移流动&#xff0c;难免会产生数据一致性的问题&#xff0c;而结构与数据不一致往往是导致故障的原因之一。所以&a…

分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测

分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测&…

stl格式-3D三角形

文章目录 什么是stl文件?格式首选stl的语法1.这是一个stl格式的文件:(ASCII码)2.下面先举个例子(难度略微提示)补充:关于\<\<我试了一下:这个法线你随便写好像也没问题\>> 3.来个立方体4.最后再写一个由三个直角形组成的立方体(直棱锥)5.amend 修正(右手定则,法线…

纯css html 真实水滴效果

惯例,不多说直接上图 秉承着开源精神,我们将这段代码无私地分享给大家&#xff0c;因为我们深信&#xff0c;信息的共享和互相学习是推动科技进步的关键。我们鼓励大家在使用这段代码的同时&#xff0c;也能够将其中的原理、思想和经验分享给更多的人。 这份代码是我们团队用心…

基于Linux系统聊天室增加数据库sqlite功能实现(08)

全部掌握后&#xff0c;开始进入本篇。 一. 调整目录结构 为了方便编译&#xff0c;现在我们将前面文章的代码结构做如下调整。 rootubuntu:/mnt/hgfs/code/chat# tree . . ├── chat_client │ ├── include │ ├── Makefile │ ├── obj │ │ └── …

面试总结之Spring篇

一、AOP 1、什么是AOP 1.1、概述 AOP&#xff08;Aspect-Oriented Programming&#xff09;&#xff1a;面向切面编程&#xff0c;即把一些业务逻辑中的相同代码抽取出来&#xff0c;让业务逻辑更加简练清爽 如果要CRUD写一堆业务&#xff0c;可如何实现业务代码前后进行打印…

自动化测试工具之Selenium IDE录制教程

一、下载Selenium IDE 下载传送带&#xff1a;Selenium IDE Open source record and playback test automation for the web 这里Darren洋以firefox火狐浏览器为例&#xff0c;将以上下载url直接在firefox浏览器中打开&#xff0c;点击对应下载按钮后&#xff0c;就会进入添加…

【网络协议】TCP

TCP协议全称为传输控制协议(Transmission Control Protocol).要理解TCP就要从他的特性开始说&#xff0c;这些特性各自之间或多或少各有联结&#xff0c;需要以宏观视角来看待。 目录&#xff1a; 1.TCP报文格式 因为报文解释过于繁琐&#xff0c;具体内容请看这篇文章TCP报文…

架构案例2022(四十二)

促销管理系统 某电子商务公司拟升级其会员与促销管理系统&#xff0c;向用户提供个性化服务&#xff0c;提高用户的粘性。在项目立项之初&#xff0c;公司领导层一致认为本次升级的主要目标是提升会员管理方式的灵活性&#xff0c;由于当前用户规模不大&#xff0c;业务也相对…