• unr #6day1 T2题解


    看着题解我没太理解 我一直没搞懂那个 p r e pre pre 的为转移为什么不会重复) 后来我迷过来了

    希望您先看过官方题解 并且有一定的理解之后 再来看我这一点浅薄的补充

    60pts

    我们从60分的dp套dp开始

    首先我们要搞明白 f i , j , v f_{i,j,v} fi,j,v 这个dp方程为什么有必要

    考虑一种不对的dp f i , j , k , w f_{i,j,k,w} fi,j,k,w 表示前 i i i 个位置 用了 j j j S S S 里的字符 剩余 k k k 个0没用 w w w 个1没用

    上述dp不对的原因是会重复

    所以我们得考虑 我们不能dp:有多少种方法能拼序列。

    而是要dp: 有多少种序列能被表示

    因此 f i , j , v f_{i,j,v} fi,j,v 这个dp方程里 v v v 的作用就在于区分不同的 T T T 我们不再关注 T T T 可以被 s , t s,t s,t 怎么组合出,只关心它:能不能被组合出,而不同的组合方式视作相同 记录在 v v v

    100pts

    瓶颈在与 v v v 所以我们考虑要钦定 T T T 中能被 S S S 表示的位置 优先被 S S S 表示 除非与 S S S 不同 才用 T T T 里的字符

    f i , j f_{i,j} fi,j 表示 S S S 在第 i i i 位 剩余 j j j t t t 里的0

    这样有一个问题 比如序列010100

    假设 S = 010101 S=010101 S=010101

    那么按照我们的钦定规则 在考虑第六位的时候有一个很尴尬的事: 我们 S S S 表示不了了 但是也没有 1

    这个时候我们再考虑去调整 S S S 的匹配范围: 把它缩小

    这样 S S S 每次都尽量匹配极长 就一定不重了

    那么请问要缩小多少呢

    我们考虑把0看成+1 1 看成 -1 然后做前缀和

    把当前位置记作 j j j 找到最近的 i i i 满足 b s i < b s j bs_ibsi<bsj 注意 这里是 s s s 序列 而不是 T T T 序列 s s s 序列 反应在 T T T 上并不一定连续

    那么可以注意到 [ i + 1 , j ] [i+1,j] [i+1,j] 的这一段一定形如 1…(1的个数比-1的个数恰好大1)

    如果用t来代替这一段 就正好多了一个位置 可以补给我们目前扫到的 T T T 上的这一位置 k k k

    那么新匹配的长度就是 i i i

  • 相关阅读:
    Python学习第10天:类与对象
    Linux(centos)服务器10秒快速配置Java环境
    49. Group Anagrams
    SpringBoot3集成WebSocket
    【文件读取/包含】任意文件读取漏洞 afr_1
    JavaScript中的一等公民: 函数(Function)
    数据湖:OPPO数据湖统一存储技术实践
    【3D 图像分割】基于 Pytorch 的 3D 图像分割11(预测结果 recall 和 FPAR 评估)
    隔离第68天,我把“大厂面试指南”进行了重新梳理,V3.0版已上线
    docker发布镜像到阿里云与私服
  • 原文地址:https://blog.csdn.net/m0_50170681/article/details/126250202