基因匹配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)$