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)$

  • 相关阅读:
    4-1 zookeeper常用命令行操作
    3 zookeeper 基本数据模型
    2 ZooKeep安装
    1 zookeeper的特性
    js数据类型
    javascript中的严格模式
    2 Vue中组件开发
    1 Vue的基础语法
    责任链设计模式
    四中网络专线接入方式
  • 原文地址:https://www.cnblogs.com/skyh/p/11200867.html
Copyright © 2011-2022 走看看