动态规划 Dynamic Programming DP

准则

动态规划的本质,是对问题状态的定义和状态转移方程的定义。

动态规划是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。

如何拆分问题,才是动态规划的核心。

而拆分问题,靠的就是状态的定义和状态转移方程的定义。

以LIS为例,重新定义这个问题:

给定一个数列,长度为N,

设F_{k}为:以数列中第k项结尾的最长上升子序列的长度.

求F_{1}..F_{N} 中的最大值.

对于F_{k}来讲,F_{1} .. F_{k-1}都是F_{k}的子问题:因为以第k项结尾的最长递增子序列(下称LIS),包含着以第1..k-1中某项结尾的LIS。

上述的新问题F_{k}也可以叫做状态,定义中的“F_{k}为数列中第k项结尾的LIS的长度”,就叫做对状态的定义。

之所以把F_{k}做“状态”而不是“问题” ,一是因为避免跟原问题中“问题”混淆,二是因为这个新问题是数学化定义的。

上述状态定义好之后,状态和状态之间的关系式,就叫做状态转移方程。

比如,对于LIS问题,状态转移方程为:

以第k项结尾的LIS的长度是:保证第i项比第k项小的情况下,以第i项结尾的LIS长度加一的最大值,取遍i的所有值(i小于k)。

a. “缓存”,“重叠子问题”,“记忆化”

这三个名词,都是在阐述递推式求解的技巧。以Fibonacci数列为例,计算第100项的时候,需要计算第99项和98项;在计算第101项的时候,需要第100项和第99项,这时候你还需要重新计算第99项吗?不需要,你只需要在第一次计算的时候把它记下来就可以了。上述的需要再次计算的“第99项”,就叫“重叠子问题”。如果没有计算过,就按照递推式计算,如果计算过,直接使用,就像“缓存”一样,这种方法,叫做“记忆化”,这是递推式求解的技巧。这种技巧,通俗的说叫“花费空间来节省时间”。都不是动态规划的本质,不是动态规划的核心。

b. “自上而下”,“自下而上”

“递归”:递归是递推式求解的方法,连技巧都算不上。

怎么实现dp?答:两种常用的方法。(仅仅涉及一般问题)

1. 自下而上:通过正向的loop,求出所有状态对应的值,然后找出max或者min。             优缺点:速度慢,但是相对节省空间。

2. 自上而下:通过递归的方法,需要求解f(x),则必须知道f(y),要知道f(y),必须求f(z).            优缺点:速度快,只用算需要的值,但是要调用堆栈,浪费空间。

c. "无后效性",“最优子结构”

上述的状态转移方程中,等式右边不会用到下标大于左边i或者k的值,这是"无后效性"的通俗上的数学定义,符合这种定义的状态定义,我们可以说它具有“最优子结构”的性质,在动态规划中我们要做的,就是找到这种“最优子结构”。

每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到

这个性质叫做最优子结构;

而不管之前这个状态是如何得到的

这个性质叫做无后效性。

在对状态和状态转移方程的定义过程中,满足“最优子结构”是一个隐含的条件(否则根本定义不出来)。

d. 关于复杂度的分析

时间复杂度O (状态数 * 每个状态下所对应的决策数)。

空间复杂度O (状态数)。

动态规划做多了以后,总结的相关知识相关推荐

  1. buu(前三页第二弹) RSA习题与相关知识总结

    文章目录 buu [ACTF新生赛2020]crypto-rsa3 1 题目描述: 题目分析: 收获与体会: buu [WUSTCTF2020]情书 1 题目描述: 题目分析: 收获与体会: buu ...

  2. Unity开发-网络.算法.平台相关知识!

    A. 网络相关知识 一.TCP 1.面向数据流.可靠.能保证消息到达顺序. 2.滑动窗口.控制发送量,发送方只能发送窗口内大小的数据包.防止发送方发送的数据过多,接收方无法处理的情况. 3.Nagle ...

  3. JS作用域相关知识(#精)

    在学习<你不知道的JS>一书中,特将作用域相关知识在此分享一下: #说到作用域,就不得不提到LHS查询和RHS查询: 1)如果查询目的是对变量进行赋值,则使用LHS查询 2)如果查询目的是 ...

  4. 工业相机参数之帧率相关知识详解

    点击上方"小白学视觉",选择加"星标"或"置顶"重磅干货,第一时间送达 工业相机是机器视觉系统的重要组成部分之一,在机器视觉系统中有着非常重 ...

  5. shell的相关知识(变量、脚本定义)

    一.shell的相关知识: 1.对于shell编程语言大体分为:机器语言.汇编语言.高级语言 2.shell变量类型:事先确定数据的存储格式和长度 shell变量分为:字符型.数值型 数值型又分为:整 ...

  6. 视频压缩算法的相关知识

    视频压缩算法的相关知识 MPEG-1 MPEG 视频压缩编码后包括三种元素:I帧(I-frames).P帧(P-frames)和B帧(B-frames).在MPEG编码的过程中,部分视频帧序列压缩成为 ...

  7. linux 格式化 dvd,linux 服务器分区格式化相关知识 -mount

    关于linux 系统mount和mkfs 的相关知识: 使用mount 1)Mount的相关格式:mount [-t 文件类型][-o  选项] devicedir 详解: -t 文件类型,通常默认m ...

  8. WinForm开发,窗体显示和窗体传值相关知识总结

    以前对WinForm窗体显示和窗体间传值了解不是很清楚 最近做了一些WinForm开发,把用到的相关知识整理如下 A.WinForm中窗体显示显示窗体可以有以下2种方法: Form.ShowDialo ...

  9. js基础--数据类型检测的相关知识

    欢迎访问我的个人博客:www.xiaolongwu.cn 前言 最近工作有点忙,好几天都没更新技术博客了. 周末起床打开有道云笔记,发现自己的博客todolist里躺了一堆只有名字的文件. 话不多说, ...

  10. 转载:关于错排的相关知识

    转载:关于错排的相关知识 杭电2048相关知识充电 转自:错排公式 分类: 数论 关于程序2012-06-08 19:07 335人阅读 评论(0) 收藏 举报 n2 错排问题 错排问题 就是一种递推 ...

最新文章

  1. CreateFileMapping
  2. 华夏幸福产业研究院顾强:从极限通勤看都市圈规划与发展
  3. 【转】VS 安全开发生命周期(SDL)检查
  4. docker镜像制作(一)
  5. (二) 时间/空间复杂度计算
  6. 摆脱困境:在每种测试方法之前重置自动增量列
  7. C# webbrowser 代理
  8. 基于Spring Boot+Vue的考试系统
  9. Centos VNC 远程桌面程序的安装使用
  10. 杭电2103---Family planning
  11. m7405d粉盒清零方法_联想打印机 多功能一体机全系列硒鼓清零方法
  12. Alexa 世界排名推进工具--阿雷克斯(转)
  13. 外汇兑换人民币业务的居民
  14. VM16-ubuntu16桥接网络频繁掉线
  15. js 预编译 AO对象跟GO对象
  16. QCM2290 充电指示灯 —— CHG_LED_SINK
  17. Mac下手动备份Mysql数据库
  18. 微型计算机代表性机型,微型计算机原理及应用技术
  19. 程序员最全职业技能知识体系图谱
  20. Java注解和反射,美团Java面试题库

热门文章

  1. java开发和基于asp.net开发有什么优越性?_java语言的入门开始介绍
  2. asterisk1.8 账号信息mysql存储(动态)
  3. java正则过滤js_JS/Java正则表达式验证
  4. nginx离线安装_web高可用-基于keepalived和nginx
  5. shell 脚本比较字符串相等_比较带空格的字符串相等的Shell脚本 如何比较两个.....
  6. sklearn的逻辑回归
  7. 【译】谨慎使用CSS中的波浪选择器
  8. 11单件模式(Singleton Pattern)
  9. android 按下缩小效果松开恢复_Android自定义ScrollView实现放大回弹效果
  10. sqlserver连接字符串_10分钟使用EF Core连接MSSQL数据库