第七章 动态规划总结.docVIP

  1. 1、本文档共9页,可阅读全部内容。
  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文档。上传文档
查看更多
动态规划总结 专题一 状态表示 在用动态规划解题时,我么往往第一个考虑的是数组维数,其实数组维度(和状态表示)是有规律可循的: 二维空间的DP: 一般采用二位数组——d[i,j]表示当i,j为某一边角时的极值(e:d[i,j]可以表示以i,j为右上角时所能构成的正方形的边长最大值——听不懂?接着往下看)。 还有一种表示方法:d[i,num]表示走到第i各阶段的第num个位置: 1,1 2,2 3,3 4,4 5,5 6,6 2,1 3,2 4,3 5,4 6,5 7,5 3,1 4,2 5,3 6,4 7,4 8,4 4,1 5,2 6,3 7,3 8,3 9,3 5,1 6,2 7,2 8,2 9,2 10,2 6,1 7,1 8,1 9,1 10,1 11,1 这种表示解决“多次访问同一图”类的DP题很有用。 阶段决策类的DP: 这里指阶段划分十分明显的题(0/1背包)。 一般采用d[i,j]表示执行到第i各阶段,剩余代价为j时,所能取得的最高分。(如果限制条件多,可增加维度)。 树形关系类的DP: 一般用d[i]来表示以i为根节点的最优值,可以加维来保证正确性。 线性关系类的DP: 这一类的DP最简单,是每一个OIER的必备基础,在这里就不废话了。 专题二 状态转移 (专题二与专题一的分类标准不同,因为dugushuiyi说这样分更好,感谢他) 线性转移 一般公式:d[i]= operation(d[j]+w[j,i])(w[i]为由j转移到i的消耗){operation为求最值} 阶段性转移 一般公式: d[i,j]:= operation(d[i-1,k]+w[k,j],d[i-2,……) 如果只涉及到前面的有限个阶段,可以使用滚动数组。 D[I mod n,j]= operation(d[(i-1)mod n,k]+w[k,j],d[(i-2)mod n,……) 树性转移 一般公式: D[i,j]=max(d[lson[i],k1]+w[j,k1],d[rson[i],k2]+w[j,k2]) 遍历顺序一般为后序遍历顺序。 多维空间转移 一般公式: d[i,j]:=max(d[i-1,j]+w1,d[i,j-1]+w2) 复杂度分析: DP的复杂度为: 状态表示的数组维数*状态转移的代价 So A 的复杂度为O(n^2) BCD:O(n^3); 专题三 题目分类总结 一般类试题 题库: 最长不下降子序列 最长匹配前缀 邮票组合 共性总结: 题目一般可以通过for 语句来枚举状态,所以时间复杂度为O(N^2) 本类的状态是基础的基础,大部分的动态规划都要用到它,成为一个维。 一般来说,有两种编号的状态: 状态(i)表示前i个元素决策组成的一个状态。 状态(i)表示用到了第i个元素,和其他在1到i-1间的元素,决策组成有的一个状态。 01背包:(重点)★★★ 题库: 01背包(USACO、vijos1025、1104) 装箱问题(NOIP01 Trade 4)、 取火柴问题(sgu153 Playing with matches) 共性总结: 一般都从阶段的角度来表示状态 因为d[i,j]只与d[i-1,k]有关,所以可以用滚动数组来实现。D[odd(i),j] 各例分析: 采药(NOIP2006、vijos) 一个背包,每个物品只能放一次。 (1)D[i,j]:=max(d[i,j],d[i,j-t[i]]+p[i]); D[I,j]表示决策了前i个物品,花费了j的代价 优化:滚动数组. (2)D[odd(i),j]:=max(d[i-1,j],d[odd(i-1),j-t[i]]+p[i]); 观察(2)不难发现,当我们算到j时,1(j-1并没有更新,而d[i-1,j-t[i]]一定在1(j-1的范围内,所以完全可以用一位数组,方程为:d[i]:=max(d[i],d[i-t[j]]+p[j]) 在最外层循环一下j就ok了。(精益求精) 总分(USACO) 一个背包,可以重复放物品。 D[i]:=max(d[i],d[i-t[j]]+p[j]) D[i]表示花费i各单位时间所能达到的最大值。(较简单) Raucous Rockers(USACO) 多个背包,不可以重复放物品,但放物品的顺序有限制。 d[I,j,k]:=max(d[I-1,j,k],d[I-1,j,k-t[i]]+p[i],d[i-1,j-1,maxtime-t[i]]) d[I,j,k]表示决策到第i个物品、第j个背包,此背包花费了k的空间。d[I-1,j,k]表示不取i,d[I-1,j,k-t[i]]表示取了i病房入背包j中,d[i-1,j-1,maxtime-t[i]] 表示取了

文档评论(0)

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

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

1亿VIP精品文档

相关文档