第9章动态规划初步

学习目标

?理解状态和状态转移方程

?理解最优子结构和重叠子问题

?熟练运用递推法和记忆化搜索求解数字三角形问题

?熟悉DAG上动态规划的常见思路、两种状态定义方法和刷表法

?掌握记忆化搜索在实现方面的注意事项

?掌握记忆化搜索和递推中输出方案的方法

?掌握递推中滚动数组的使用方法

?熟练解决经典动态规划问题

动态规划的理论性和实践性都比较强,一方面需要理解“状态”、“状态转移”、“最优子结构”、“重叠子问题”等概念,另一方面又需要根据题目的条件灵活设计算法。可以这样说,对动态规划的掌握情况在很大程度上能直接影响一个选手的分析和建模能力。

9.1 数字三角形

动态规划是一种用途很广的问题求解方法,它本身并不是一个特定的算法,而是一种思想,一种手段。下面通过一个题目阐述动态规划的基本思路和特点。

9.1.1 问题描述与状态定义

数字三角形问题。有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数,如图9-1所示。

(a)数字三角形 ? (b)格子编号

图9-1 数字三角形问题

从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来。如何走才能使得这个和尽量大?

【分析】

如果熟悉回溯法,可能会立刻发现这是一个动态的决策问题:每次有两种选择——左下或右下。如果用回溯法求出所有可能的路线,就可以从中选出最优路线。但和往常一样,回溯法的效率太低:一个n层数字三角形的完整路线有2n-1条,当n很大时回溯法的速度将让人无法忍受。

为了得到高效的算法,需要用抽象的方法思考问题:把当前的位置(i, j)看成一个状态(还记得吗?),然后定义状态(i, j)的指标函数d(i, j)为从格子(i, j)出发时能得到的最大和(包括格子(i, j)本身的值)。在这个状态定义下,原问题的解是d(1, 1)。

下面看看不同状态之间是如何转移的。从格子(i, j)出发有两种决策。如果往左走,则走到(i+1, j)后需要求“从(i+1, j)出发后能得到的最大和”这一问题,即d(i+1, j)。类似地,往右走之后需要求解d(i+1, j+1)。由于可以在这两个决策中自由选择,所以应选择d(i+1,j)和d(i+1,j+1)中较大的一个。换句话说,得到了所谓的状态转移方程:

如果往左走,那么最好情况等于(i, j)格子里的值a(i, j)与“从(i+1, j)出发的最大总和”之和,此时需注意这里的“最大”二字。如果连“从(i+1,j)出发走到底部”这部分的和都不是最大的,加上a(i, j)之后肯定也不是最大的。这个性质称为最优子结构(optimal substructure),也可以描述成“全局最优解包含局部最优解”。不管怎样,状态和状态转移方程一起完整地描述了具体的算法。

提示9-1:动态规划的核心是状态和状态转移方程。

9.1.2 记忆化搜索与递推

有了状态转移方程之后,应怎样计算呢?

方法1:递归计算。程序如下(需注意边界处理):

int solve(int i, int j){

return a[i][j] + (i == n ? 0 : max(solve(i+1,j),solve(i+1,j+1)));

}

这样做是正确的,但时间效率太低,其原因在于重复计算。

如图9-2所示为函数solve(1, 1)对应的调用关系树。看到了吗?solve(3, 2)被计算了两次(一次是solve(2, 1)需要的,一次是solve(2, 2)需要的)。也许读者会认为重复算一两个数没有太大影响,但事实是:这样的重复不是单个结点,而是一棵子树。如果原来的三角形有n层,则调用关系树也会有n层,一共有2n-1个结点。

提示9-2:用直接递归的方法计算状态转移方程,效率往往十分低下。其原因是相同的子问题被重复计算了多次。

方法2:递推计算。程序如下(需再次注意边界处理):

int i, j;

for(j = 1; j <= n; j++) d[n][j] = a[n][j];

for(i = n-1; i >= 1; i--)

for(j = 1; j <= i; j++)

d[i][j] = a[i][j] + max(d[i+1][j],d[i+1][j+1]);

程序的时间复杂度显然是O(n2),但为什么可以这样计算呢?原因在于:i是逆序枚举的,因此在计算d[i][j]前,它所需要的d[i+1][j]和d[i+1][j+1]一定已经计算出来了。

提示9-3:可以用递推法计算状态转移方程。递推的关键是边界和计算顺序。在多数情况下,递推法的时间复杂度是:状态总数×每个状态的决策个数×决策时间。如果不同状态

c语言 lis的nlogn算法,ACM竞赛高级算法讲义.doc相关推荐

  1. python谱聚类算法_Python机器学习高级算法!谱聚类(Spectal Clustering)算法分析和实例详解...

    谱聚类(Spectal Clustering)算法是聚类算法的一种,比起传统的K-Means聚类算法,谱聚类算法的效果更优秀,其计算量也小很多,除了谱聚类和K-Means聚类算法,另外还有密度聚类和层 ...

  2. ACM如何入门,ACM竞赛需要学习哪些算法?

    #################成绩################## 大一:2017年4月份"玲珑杯"河南工业大学2017年ACM程序设计大赛暨河南高校邀请赛,获得银奖 20 ...

  3. acm题库c语言,C语言acm竞赛习题集锦.doc

    C语言acm竞赛习题集锦.doc 杭州电子科技大学 acm 习题精选 第 1 页 共 21 页 目录 1. 数塔问题 2 2. 并查集类问题 4 3. 递推类问题 9 4. 动态规划系列 10 5. ...

  4. 两年ACM竞赛的所有算法总结

    这是我经过两年ACM竞赛的所有算法总结,希望对你有帮助. 目录 最短路 Floyd Dijkstra SPFA 最小生成树 Kruskal Prim 动态规划 01背包 完全背包 多重背包 最长公共子 ...

  5. c语言切面条对折的次数n,c语言竞赛和算法总结

    <c语言竞赛和算法总结>由会员分享,可在线阅读,更多相关<c语言竞赛和算法总结(22页珍藏版)>请在人人文库网上搜索. 1.目录1. 10进制转2进制-42. 啤酒和饮料 -5 ...

  6. 22南工计算机学院新生培训最终章---ACM竞赛机制

    文章目录 前言 前文 一.程序竞赛种类 二.ACM赛制 1. 简介 做题反馈 排名根据 三.其他竞赛 1.OI赛制 做题反馈 排名根据 2.IOI赛制 做题反馈 排名根据 四.一些帮助 网站分享 1. ...

  7. c语言常用算法pdf,妙趣横生的算法(C语言实现 第2版) 带目录完整pdf[94MB]

    <妙趣横生的算法(C语言实现 第2版)>是深受广大读者好评的<妙趣横生的算法(C语言实现)>一书的全新升级版.本书在第1版的基础上对原书内容做了大量的调整和补充,并将书中的实例 ...

  8. 河南省第十二届ACM竞赛总结

    昨天下午紧张刺激的省ACM竞赛结束了,五个小时的大脑超频运转,五十多个学校的二百三十一支队伍在黄淮学院体育场的激烈角逐,这次比上次的CCPC结果要好,一个多月的辛苦总算没有付诸东流,最终我们队取得铜奖 ...

  9. 2021年ACM竞赛班训练(六)题解

    2021年ACM竞赛班训练(六)题解 ==Problem A 逆元== 题目描述 输入 输出 题目分析 代码 ==Problem B&C 五一假期前最后一题&女神的考验== 题目描述 ...

最新文章

  1. 做转录组测序前需要知道的那些事
  2. facade 提供一个接口,通过这个接口,可以使一个子系统更容易使用。
  3. vue $set修改对象
  4. (Python)from collections import Counter统计包
  5. 月薪40K的推荐算法工程师,需要具备怎样的技能?
  6. FTP的主动模式(PORT Mode)及被动模式(Passive Mode)
  7. android自动化持续集成,基于持续集成的Android自动化测试.pdf
  8. 【机器学习】 - 关于Keras的深入理解
  9. android 工厂模式创建,7、Android设计模式---(创建型设计模式)抽象工厂模式
  10. mongo04---基本查询
  11. 初识Python(二)
  12. 三招帮你解决物联网卡上不了网问题
  13. Kinect开发教程八:OpenNI2显示深度、彩色及融合图像
  14. c string erase_威刚推出SE770G移动固态硬盘:提供两年质保 附送双头USB-C
  15. 对Map集合排序,先对value降序,value相同的情况下,key升序
  16. 《王亡於江上》之周昭王姬瑕
  17. 微麦投影仪android遥控器,投影仪遥控器如何使用 投影仪遥控器使用方法【详解】...
  18. php虚线_实现css虚线样式的两种方式:dotted和dashed(实例)
  19. sina 股票接口 2022.1.21 更新
  20. nbiot和2g_NBIoT网络覆盖性能评价与优化

热门文章

  1. Linux中SysRq的使用[zt]
  2. 《oracle大型数据库系统在AIX/unix上的实战详解》讨论31: oracle、sybase 数据库的不同访问...
  3. python b64 图片处理
  4. 开发笔记13 | 部署 Node.js 应用程序到云 ECS
  5. Spring系列之Spring框架和SpringAOP集成过程分析(十)
  6. 记录:自制的小说推荐程序(一)
  7. Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.107.el6.i686
  8. 几种流行Webservice框架性能对比
  9. CDN 二级回源实现
  10. python中float与eval式一样的吗_用Python最原始的函数模拟eval函数的浮点数运算功能...