当前位置: 首页 > news >正文

【算法】算法设计与分析 课程笔记 第三章 动态规划

1.1 动态规划简介

1.1.1 引例

动态规划算法和分治法类似,基本思想也是将待求解问题分解成若干个子问题,子问题可以以继续拆分,直到问题规模达到临界条件即可。多说无益,举个例子来解释一下:

这其实是一个多阶段图求最短路的问题,路径大体上是 A→B→C→D→E,但是每到一个节点时就需要面临许多选择,所有选择中加起来最短的那一组就是要求的答案。

我们可以用动态规划的思想来分析这个问题,最开始从A出发,我们要选择一条最短的路,那么就可以把这个大问题先分成两个:从A到B和从B到E,这样就把大问题拆成两个小问题了,接下来,从A到B有两个选择,分别是B1和B2,它们和从B到E的路径相连,接下来就可以继续拆分,从B1到E和从B2到E又可以拆分成两个小问题,那就是从B到C和从C到E.......就这样一直拆下去,直到最后从D到E,这样再往回返回最短路径,直到得到整个问题的最短路径。

1.1.2 算法总体思想

从上面我们知道,动态规划算法也是不断地拆分问题,但是这里和之前的递归又有所不同,因为动态规划类的问题中,分解得到的子问题一般不会是相互独立的,也就是说有可能得到相同的子问题,所以在计算中,如果单单应用了递归,有些子问题就会被重复计算。

因此,适合使用动态规划来解决的问题一般都有下面两个性质:

1. 最优子结构性质

一个问题的最优解包含了其子问题的最优解。

2. 重叠子问题性质

在问题的求解过程中,很多子问题的解会被多次使用。

3.1 矩阵连乘问题

http://www.lryc.cn/news/185814.html

相关文章:

  • 贪心找性质+dp表示+矩阵表示+线段树维护:CF573D
  • 小谈设计模式(17)—状态模式
  • Arm64体系架构-MPIDR_EL1寄存器
  • MySQL支持哪些存储引擎
  • ElementUI结合Vue完成主页的CUD(增删改)表单验证
  • Flutter开发笔记 —— 语音消息功能实现
  • 冒泡排序和选择排序
  • 【深度学习】UNIT-DDPM核心讲解
  • Java 线程的优先级
  • 金融数学方法:牛顿法
  • MongoTemplate | 多条件查询
  • 优秀程序员是怎么思考的?
  • 【juc】countdownlatch实现游戏进度
  • Spring Webflux HttpHandler源码整理
  • Qt扩展-Advanced-Docking 简介及配置
  • Decorator
  • 分布式文件系统HDFS(林子雨慕课课程)
  • CSS中:root伪类的使用
  • VulnHub JANGOW
  • OpenMesh 获取网格面片各个顶点
  • 【前端设计模式】之原型模式
  • 软件设计原则
  • 【面试HOT100】哈希双指针滑动窗口
  • Ubuntu20.04 配置 yolov5_ros 功能包记录
  • Flink的处理函数——processFunction
  • Linux系统中的ps命令详解及用法介绍
  • 机器学习笔记 - 基于pytorch、grad-cam的计算机视觉的高级可解释人工智能
  • Python 编程基础 | 第五章-类与对象 | 5.1、定义类
  • 合宙Air780e+luatos+腾讯云物联网平台完成设备通信与控制(属性上报+4G远程点灯)
  • c++系列之string的模拟实现