zoukankan      html  css  js  c++  java
  • 远古杂题 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)$

  • 相关阅读:
    BZOJ 1101 莫比乌斯函数+分块
    BZOJ 2045 容斥原理
    BZOJ 4636 (动态开节点)线段树
    BZOJ 2005 容斥原理
    BZOJ 2190 欧拉函数
    BZOJ 2818 欧拉函数
    BZOJ 3123 主席树 启发式合并
    812. Largest Triangle Area
    805. Split Array With Same Average
    794. Valid Tic-Tac-Toe State
  • 原文地址:https://www.cnblogs.com/skyh/p/11200867.html
Copyright © 2011-2022 走看看