动态规划入门讲解.pptVIP

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态规划入门讲解

* 动态规划入门讲解2 动态规划的优化技巧 By 张惜今 动态规划的复杂度优化 多项式级时间复杂度 规模较大的问题(10^5,10^6) 降低一个阶 动态规划的复杂度计算 通用的计算方法: 时间复杂度=状态总数*决策数*每次决策的时间复杂度 空间复杂度=状态总数+辅助空间 优化方法 三个因素不可得兼 减少状态总数 改变决策方式 优化决策效率 动态规划的空间复杂度优化 当今程序设计竞赛对空间要求不高 32MB-256MB 仍然可能有优化需要 1. 使用滚动数组 2.避免不必要的状态维 使用滚动数组 线性连接的问题 f[i][]只会从f[i-1][]更新 不必保存之前的 F[0..1][] i=1-i 避免不必要的状态维 状态只要保存之前决策影响造成的全部信息 有多种保存方式 尽量利用信息 一个例题:灵梦的双重灵力 灵梦的双重灵力 这次,灵梦的灵符是一个正方形,N*N的矩阵中每个格子仍然表示灵力经过获得的修复值,从左上角出发,每次只能往右或者下走,最终到右下角,为灵力寻找两条不交叉的路径(除了起点终点),使路径上的修复值和最大。 改变状态表示 阶段点是不同的两点 不交叉的方式转移 f[x][y][i][j] 第一个点为x,y第二个为i,j时的最优值 每次只能走一步,阶段可以用步数表示 一个坐标+步数--另一个坐标 f[[x][y][i][j]--f[l][i][j] 空间降低了一维 时间也可以减少 动态规划的时间复杂度优化 时间复杂度优化是重点 从思维复杂实现简单的改变状态 到非常麻烦的搞基数据结构 蕾米的出门方案(HDU3905) 大小姐蕾米利亚是个500岁的老Loli,更重要的是,她是个吸血鬼,吸血鬼是不能见到阳光的,为了自己的出行方便,她还曾经引起过幻想乡的异变。话说在一段时间内,总共有N(N1000)分钟,在第i分钟出门她会获得ai的办事方便值,出门一次,就要连续在外面待L分钟,但是她至少要保证有M分钟是待在室内的,问她总共能获得多少办事方便值? 改变状态表示 容易想到的方程: f[i][j][0]=max(f[k][j-l][0],f[k][j-l][1]) f[i][j][1]=max(f[k][j][0]+sum(k,j),f[k][j][1]) 改变状态表示 从而改变转移方式 新的状态 f[i][j][0]=max(f[i-1][j-1][0],f[i-1][j-1][1]) f[i][j][1]=max(f[i-L][j][1]+sum(i-L,i),f[i-L][j][0]+sum(i-L,i)) 咲夜的家务(CDOJ1506) 十六夜咲夜是红魔馆的女仆长,据说原来是猎杀吸血鬼的猎人,被吸血鬼打败后因为吸血鬼改变命运的能力而做了红魔馆的女仆长在为吸血鬼服务。一天,咲夜准备收拾红魔馆的家务,于是有好多乱七八糟的杂物要搬运,红魔馆可以简化为一个平面,咲夜的出发点在0,0点,她每次最多搬重量为M的物品,从起点出发,依次搬运每个物品(不能跳过和改变顺序),送完后回起点取,她的运动走两点间的曼哈顿距离,她想知道送完所有物品最少要走多少距离.最多有100000个物品 利用单调性:单调队列 方程:f[i]=min(f[j]+d[j+1]+s[i]-s[j+1]+d[i]) 时间复杂度O(n^2) 单调队列:每个元素是一个二元组:值 位置 保证值和位置都是单调的 f[j]+d[j+1]-s[j+1]作为值与i无关,选一个最小的,位置就是i 计算f[i]时:在队头删除,直到队头元素位置和i的之间的物品重量满足单次承重,那么队头元素就是最好的选择 计算完f[i]:在队尾,看队尾元素的值是否小于i处的值,小于则删除,然后i处的二元组入队 条件:范围单调 转移只用到一个根据位置在常数时间算出的值 文的报纸印刷(CDOJ1505) 射命丸文是掌握风的能力的天狗,她也是幻想乡的记者(狗仔队老大),文文晚报就是她出版的,专门发表幻想乡中的各种花边新闻。她有一台旧印刷机,这台印刷机太老了所以在不断损耗,她有N个字要印刷,每个字有一个印刷的损耗值,必须按顺序印刷出来,当把i到j这些字印刷在一行的时候,打印机会损耗这些字损耗值和的平方+常数M,请问印完所有字,最少损耗多少?(N100000) 数形结合:斜率优化 f[i]表示最后划分的一段以i结束的最小代价,f[i]=min(f[j]+(s[i]-s[j])^2+M) 这题划分的范围是随意的而不是单调的,所以不能用上面的方法优化 数形结合:这一段黑板写吧 更复杂的例子:单调队列+高级数据结构 CDOJ1501 平衡树优化(STL set) HDU3872 线段树优化 谢谢 张惜今(mfs6174) mfs6174@ * *

文档评论(0)

118books + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档