动态规划

数字三角形

如上图所示,请找出一条自顶向下路径,使得该路径上所有数字的和最大

  • 如何定义状态?第i行第j个数
  • 如何进行搜索?DFS枚举所有路径即可(回溯法
  • 时间复杂度?若共有n层,时间复杂度O(2^n)

是否可以减少不必要的搜索(规避不必要的状态转移)了呢?

  • 注意第3行第2个数
  • 价值函数定义恰当,则只需搜过一次即可:记忆化搜索

动态规划Dynamic programming,DP

在搜索过程中,对于已经搜索过、且价值函数不会再度更新(或变优)的状态,则可以通过记忆化的方式,规避重复搜索

因此,才有动态规划算法适用问题所具备的必要条件

  • 最优子结构:最优解可以由子问题的最优解(或部分状态的最优价值函数)构造得出
  • 重叠子问题:一些子问题(或状态)在搜索中会重复遇到
  • 无后效性:子问题最优解一旦确定就不会再被更新
    • 该性质可以直接否定某些问题使用动态规划的可行性。其实,此性质暗示了动态规划可解问题的状态空间一般都是有向无环图

动态规划的宏观理解

本质就是状态空间中的一种“聪明的”搜索策略,因此

  • 依然需要恰当准确的状态空间建模
  • 重点在于状态的价值函数的设计(通常为优化目标函数
  • 同时,状态转移过程中的价值函数更新方式也很关键

关键点

动态规划算法解决问题的难点不仅是能否准确地、用尽可能少的状态变量(或称为维度)对问题建模,还要设计合理的价值函数(甚至赋予特殊意义),并准确地给出价值函数在状态转移过程中的更新方式

鉴于以上,才可以总结出动态规划算法设计的三个关键环节

  1. 定义状态和价值函数(建模
  2. 确定初始状态和对应价值(边界
  3. 确定状态转移中的价值更新方式(状态转移方程

动态规划两种实现

记忆化搜索Memorization

自顶向下(top-down)的实现(DP的本质:暴力搜索优化)

  • 状态:递归函数的参数形式
  • 状态转移:函数调用,通过实际传入参数
  • 价值函数:函数的返回值,须记录(数组或字典)

打表法Tabulation

自底向上(bottom-up)的实现(动态规划的常见方案)

  • 状态:数组的下标
  • 状态转移:数组元素间的递推关系
  • 价值函数:数组的

所以如何游刃有余地掌握动态规划算法?积累模型

类型Ⅰ:一维递推问题(求和形式)

爬楼梯

一个由n级台阶的楼梯,每步可以迈1、2、3级,问爬完这段楼梯有几种不同的方式?

  • 如何定义状态和价值函数?f(i)表示走到第i级台阶的种类数
  • 状态转移方程?
  • 边界与答案?边界,答案为
  • 时间复杂度?O(n)

优化方式

矩阵快速幂优化,O(log n)

类型Ⅱ:一维递推问题(最值形式)

  • 最长上升子序列Longest increasing sequence,LIS

给一个数组,请找出这个数组中的一个最长的单调递增子序列(可以不连续)

  • 如何定义状态和价值函数?f(i)为第i个数作为结尾的最长上升子序列的长度
  • 状态转移方程?
  • 边界与答案?,答案为
  • 时间复杂度?O(n^2)

优化方式

  • 单调队列/栈优化 Monotonic queue/stack
  • 斜率优化 Convex hull trick

类型Ⅲ:二维问题----区间问题

最长回文子序列Longest Palindromic Subsequence

回文指形如:“ABBA”,“CDC”等正反一样的序列,给出任意序列,计算最长回文子序列长度。(如“GOODGAME”的答案“GOOG”)

  • 如何定义状态和价值函数?表示区间i,j之间的最长回文子序列长度
  • 状态转移方程?
  • 边界与答案?,答案
  • 时间复杂度?O(n^2)

回文子序列的个数Couting Palindromic Subsequences

求字符串中回文子序列的个数。(如CDC的回文子序列包括C,D,C,CC,CDC,共5个,位置不同的相同序列需要重复计数

  • 如何定义状态和价值函数?表示区间i,j之间的最长回文子序列个数
  • 状态转移方程?
  • 边界与答案?,答案
  • 时间复杂度?O(n^2)

最优矩阵链乘法

n个矩阵连续相乘,第i个矩阵的维度为,问如何通过加括号的方式最快完成矩阵乘法?

  • 如何定义状态和价值函数?i,j间的最快方案
  • 状态转移方程?
  • 边界与答案?,答案
  • 时间复杂度?O(n^3)

优化方式

四边形不等式优化Knuth optimization

区间最值查询Range Minimum/Maximum Query,RMQ

给出长度为n的数组和m次询问,每次询问要求l,r区间内最值

  • 如何定义状态和价值函数?为以i为起点,长度为2^j的区间最值(倍增思想)
  • 状态转移方程?
  • 边界与答案?,令,答案为
  • 时间复杂度?O(n logn + m)

类型Ⅳ:二维问题----序列间比较问题

编辑距离Edit distance

给出字符串A和B,对A进行三种操作:插入、删除或替换一个字符,问由A修改为B最少要几步?

  • 如何定义状态和价值函数?为使A长度为的前缀与B长度为的前缀通过编辑实现匹配的最少次数
  • 状态转移方程?
  • 边界与答案?,答案
  • 时间复杂度?O(n^2)

类型Ⅴ:树与图上的问题

快乐聚会

某公司中有明确的上下属关系,可以用有根树表示。现举办聚会,每个人都有一个快乐指数,但是如果一个人的上属参加了聚会,那么此人就不会参加,求聚会最大快乐指数和?

  • 如何定义状态函数和价值函数?表示员工x参加/不参加聚会时其与其下属的最大快乐指数之和
  • 状态转移方程?
  • 边界与答案?,答案为
  • 时间复杂度?O(n)

南开大学软件学院2021年秋季学期研究生算法课程(复习)动态规划相关推荐

  1. 南开大学软件学院2021年秋季学期研究生计算机网络课程(复习)

    一.ARPANET核心解决的问题是什么? ARPANET研究的核心:通信网络方案的设计两个基本问题: 网络拓扑结构:分布式网络结构 数据传输方式:分组交换 二.不同的拓扑结构的特点? 集中式网络结构( ...

  2. 2021年秋季学期“大数据能力提升项目”证书办理及领取通知

    同学们,2021年秋季学期第2次证书办理工作即将开启.请满足办理证书条件的同学,按时提交申请材料.具体通知如下: [办理流程] 1. 自行再次确认报名大数据能力提升项目年份(2019年及之前.2020 ...

  3. 通知 | “大数据能力提升项目”证书办理及领取(2021年秋季学期)

    同学们,2021年秋季学期第1次证书办理工作即将开启.请满足办理证书条件的同学,按时提交申请材料.具体通知如下: [办理流程] 1. 自行再次确认报名大数据能力提升项目年份(2019年及之前.2020 ...

  4. 工程伦理2021年春季学期线上课程习题全部解答

    工程伦理2021年春季学期线上课程习题全部解答 提示:在搜索题目时也可以关注 "学小易" 公众号进行查找题目及解答,此处是个人总结的答案. 注意:有一些题号是重复的,按照题号一一对 ...

  5. 中国科学技术大学2021年秋季学期可编程逻辑器件原理及应用试题回忆版

    一.简答题 1. 请解释Tsu.Thold和Tco并画图说明 2. SignalTap II有什么特点?和传统逻辑分析仪相比有什么优点?简要说明SignalTapII的使用步骤 3. 请说明PLD的I ...

  6. 北航2020秋季学期程序设计语言原理复习

    课程内容复习 Lec5 函数式语言 急求值:急求值是严格求值(Strict),完全求值:急求值对应值调用,最安全 正规求值:函数中的形参每次出现均用实参替换(相当于传名调用).要做多次实参计算.可能有 ...

  7. opengl函数总结以及算法课程复习1

    一个老库 (glut),以后可能整新库 计算机图形学及其相关概念 : 计算机图形学iso国际标准化组织 定义 计算机图形学是研究通过计算机将数据转换成图形并在专门显示设备上显示的原理方法和技术 iee ...

  8. 南开大学 软件学院 计算机网络 2021秋季 复习

    南开大学 软件学院 计算机网络 2021秋季 复习 这是本人根据张圣林老师本学期给的复习ppt总结的,仅供参考 第一章 引言 为什么要选择五层分层 1. 网络协议以及协议目的 为进行网络中的数据交换而 ...

  9. 计算机控制中在线离线,2020年秋季学期《机电系统计算机控制》在线考试补考(适用于2021年4月份考试)【答案】...

    2020年秋季学期<机电系统计算机控制>在线考试补考(适用于2021年4月份考试) 共40道题 总分:100分 答题中 剩余答题时间:89 : 51 单选题 判断题 问答题 一.单选题 共 ...

最新文章

  1. 数据中心行业人士如何进行继续教育
  2. MongoDB 全文检索
  3. 崩溃了,一个HashMap跟面试官扯了半个小时
  4. 成功解决ValueError: Cannot feed value of shape (1, 10, 4) for Tensor Placeholder:0 , which has shape
  5. ADO.NET 【属性扩展】性别、年龄、编号
  6. 微信JSSDK分享页面自定义当前链接最简单示例
  7. linux文件IO——目录操作和文件属性
  8. oracle实现mysql的if_【原创】ORACLE的几个函数在MYSQL里面的简单实现
  9. 打印机修复工具_Windows10更新后打印机崩溃?速度安装修复补丁
  10. 当使用 position 属性时,请始终设置 !DOCTYPE 声明:当使用 float 属性时,请始终设置 !DOCTYPE 声明:
  11. 【转】Elasticsearch+Django搜索引擎(二)
  12. 全球免费开放电子图书馆
  13. 计算机设备维修与及日常保养,电脑主机日常的维护保养计划
  14. 微信商户平台(商户号)申请流程(仅供参考)
  15. Epub文件解析库-- Epublib
  16. css如何选择相同class下的第一个class元素和最后一个元素?
  17. 【秋招面经】之神策数据
  18. python 日期格式月份不加前导,Python datetime时间格式化去掉前导0
  19. 爱码物联二维码营销,开启精准营销新模式!
  20. 餐桌_纪中1237_水暴力

热门文章

  1. 样例类,样例对象,伴生类,伴生对象
  2. Java锁的几种应用
  3. 北京/深圳/上海内推 | 百度视觉技术部招聘计算机视觉算法实习生
  4. poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化
  5. Multer详解(Node.js中间件)
  6. MVVM和MVC的区别,以及MVVM的缺点
  7. 方差,标准差,标准误,均方根误差,平均绝对误差(SD,SE,RMSE,MAE)简单介绍
  8. ELK-Kibana
  9. 忘记Word文档密码?一步搞定
  10. word文档docx密码忘记了怎样能打开文档,word文档docx权限密码怎么解开?