[学科竞赛]动态规划.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[学科竞赛]动态规划

动态规划 山东省青岛第二中学 王若松 1、LIS问题 给出一个长度为n的序列 找出一个最长的递增的子序列 例如:5 1 2 4 3 Ans = 3 F[i] = max(F[j] + 1) (A[j] A[i]) Ans = max(F[i]) O(N^2) 1.1、LIS的快速算法 对于两个位置i, j 如果F[i] = F[j]但是A[i] A[j] 那么i就没用了! 我们维护G[i]表示F[x] = i,A[x]最小的一个x 1.1、LIS的快速算法 此时,计算F[i]的方法,找出A[i] A[x], G[t] = x的一个最大的t 二分查找! 最后再更新一下G数组即可 时间复杂度O(NlogN) 1.2、LIS问题变形 给出N个点,找出一些x、y坐标同时递增的点(不要求按照以前的顺序)。 例如:(5, 5) (1, 3) (2, 2) (3, 4) Ans:(1, 3) (3, 4) (5, 5) 1.2、LIS问题变形 经典LIS满足的条件 i j A[i] A[j] 这个变形问题的条件 x[i] x[j] y[i] y[j] 能否类比? 1.2、LIS问题变形 序的应用! 我们按照x坐标排序之后,就不用再考虑x坐标地增的要求了! 如何处理y坐标? LIS NlogN 1.2.1、巴比伦塔 有n种石块,石块能无限供应。每种石块都是长方体,其中第i种石块的长、宽、高分别为li、wi、hi。石块可以旋转,使得其中两维成为长度和宽度,第三维成为高度。如果要把一个石块放在另一个石块上面,必须保证上面石块的长和宽都分别严格小于下面石块的长和宽。这意味着,即使两块长宽相同的石块也不能堆砌起来。 求最多能用多少个石块? 1.2.1、巴比伦塔 将(li, wi, hi)拆成(li, wi) (wi, li) (li, hi) (hi, li) (wi, hi) (hi, wi) 转化为1.2 1.2.2、KLO 给N个积木,每个积木上面都有一个数,所有积木垒成了一个高塔。一个上面写有数i的积木的正确位置是这个塔从下往上数第i个位置。从现有的高塔中移走一些,使得有最多的积木在正确的位置。 N=100000 1.2.2、KLO 最后在正确位置的数一定是递增的。 但是一个递增的序列一定都能在正确的位置? 不一定! 考虑1 2 5这个序列。 为什么5不能出现在答案中? 两个数之间必须有足够的填充用的“废数”! 1.2.2、KLO 对于A[i] A[j] 如果Delta = A[i] – A[j] 必须满足i, j之间至少有Delta个数,也就是i – j = A[i] – A[j] 变形后得到A[i] – i = A[j] – j 1.2.2、KLO 1、i j 2、A[i] A[j] 3、A[i] - i = A[j] - j 三个条件!不是LIS问题所能处理的! 注意2、3已经隐含了1! 把A[i]看做x坐标,A[i] - i看做y坐标,套用1.2的算法 1.3 Dilworth定理 最长A子序列=最长B序列划分 A和B对立 最长不降子序列=最长下降序列划分 … 1.4、Gift 有N个数,一次操作指的是把一个数拿出来然后再放回(放到的位置自己定) 问最少几次操作可以将序列排序 例如:2 1 3 Ans=1 1.4、Gift Ans = N – LIS的长度! 2、LCS 给两个字符串,求最长公共子序列 子序列是指的是按照顺序依次提取出若干字符 例如 aba aca Ans=aa 2.1、LCS的优化 *1、通用算法:复杂度N*M/64 2、排列LCS? 给定两个1..n的排列,求LCS 2.1、LCS的优化 1 3 2 2 1 3 Ans = 2 对于每个数记录在两个字符串的出现位置,当成点对 (1, 2) (3, 1) (2, 3) 选出最多的x、y坐标都递增的点 1.2! 时间复杂度NlogN 2.2、LCS计数1 问串A的一个子序列,串B的一个子串,两者相等的有多少 例如:A=abac B = bac Ans=8 2.2、LCS计数1 F[i][j]表示A串的前i个字符,B串前j的字符的LCS的数量 F[i][j]= F[i - 1][j - 1] (when A[i]=B[j]), + F[i - 1][j] 2.2、LCS计数1 可能的问题? A可能是空串! 加一个常数维表示A串是否已经至少取了一个字符 2.2、LCS计数2 求两个串LCS的数量 例如:A=AAB B=AB Ans=2 2.2、LCS计数2 在经典做法的基础上,加入计数的部分 G[i][j]表示A串前i个,B串前j个,取到F[i][j]的方案数 考虑G[i][j]的计算 2.2、L

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档