远古杂题 1

基因匹配Match(数据结构优化dp)

题意 1~n 每个数一定出现五次在s1,s2中。求两个字符串的最长公共子序列。

考虑n²的暴力写法,对于每一个i,与他相等的一定只有五个。

所以可以记录相等的位置优化,分别查询该位置之前的最大值+1转移,Ans记录即可。

对于1~n的带修改RMQ,可以使用树状数组。

lis lcs有很大联系,可以相互转换。

将lcs与i每一位相同的j记作$(i,j)$,画在直角坐标系上,即可通过lis进行dp。

 

旅馆 Hotel(区间合并线段树)

维护合并区间线段树。即左右拓展出最长的连续为1,以及整个区间内连续为1。

对于修改,使用懒标记。

对于询问,不断以左子树>左右合并>右子树的优先级向下递归查找。通过区间最长连续判断是否可以继续。

如果区间1即最大区间最长连续不超过len,直接判断不可安排,安排后再次区间修改。

 

动物园 (状压dp)

因为每个小朋友只能看到相邻的五个,可以根据这个性质用2的五次方进行状压dp。

因为整个图是一个环,dp可能会有后效性,为了处理后效性,枚举前四位,就可以保证无后效性。

将dp每个状态的初始值设为负无穷,只将枚举的前四位对应的状态设为0即合法,

对于$dp(n)$的末状态只将枚举的前四位的状态计入答案,可以减少很多代码量。

如果对于每个小朋友进行转移,预处理简单很多,但转移来自的状态很多不易处理,

可以对每个位置进行处理,则转移的状态只来自n-1的状态左移一位加1或不加1。预处理每个位置每个状态的增量即可。
$dp(n)$只与$dp(n-1)$有关,所以可以滚动数组。

 

 

·动物园(KMP)

求一个字符串所有前缀的公共前后缀数目加一的乘积对1e9+7取模,要求前后缀不可重叠。

Kmp处理next数组。Next即最长的公共前后缀长度。

在计算next的时候顺便算出每个i的num数组,即对于前缀长度为i的公共前后缀个数,从他的next转移。

$num(i)=num(next(i))+1$

统计答案,对于每一个i,寻找符合条件的最大j,

$ans=ans*(num(j)+1)$

关于如何寻找,因为每个i符合条件的j对于他的前一个i的j增量不超过1,j可以从前一个i保留。

先找到第一个符合条件的j,将j++。如果j大于i/2,不断使$j=next(j)$。

 

 

GT考试(kmp  矩阵优化dp)

设$dp(i,0)$表示准考证到第i位,吉利的方案种数。

$dp(i,j)$表示准考证到第i位,恰好与不吉利串匹配到j位的方案种数。

显然$dp(i,0)=dp(i-1,0)*10-dp(i,m)$,即前一位的吉利种数乘10减去这一位恰好匹配到m位。  

$dp(i,j)(j!=0)$与$dp(i-1,j-1)$有关,如果它不是m串的一个next(公共前后缀),

$dp(i,j)=dp(i-1,j-1)$,

否则,它的值应该是$dp(i-1,j-1)$减去一个数,

通过脑补,我们知道这个数应该是$dp(i,m)$,即恰好匹配成不吉利串的方案数。

初始状态$dp(0,0)=1$

目标$dp(n,0)$

矩阵快速幂优化dp,复杂度$O(m+m^3*log n)$

posted @ 2019-07-17 14:32  skyh  阅读(147)  评论(0编辑  收藏  举报