- 1、本文档共45页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)