DP套DP

该技巧通常用来求满足某个要求的元素数量,而对于要求的判定需要 DP 解决。

因此我们将判定 DP 的结果作为计数 DP 的状态来进行计数。

P4590 [TJOI2018] 游园会#

题意:给你一个字符串 s,求满足条件的字符串 t 的数量:|t|=n, lcs(s,t)=i, "NOI"t

对每个 i[0,|s|] 求出答案。|s|15, n103, ={N,O,I}

fi,j 表示 t 的前缀 is 的前缀 t 的 lcs(最长公共子序列):

fi,j={fi1,j1+1ti=sjmax(fi1,j, fi,j1)tisj

要想得到 fi,我们只需知道 fi1ti,且每种方案唯一对应一组 fi1,ti

fi 压入状态减小复杂度。dp(i,fi) 表示考虑了前 i 个字符,第 i 维 dp 数组为 fi 的方案数,枚举 ti 转移

合法的 fi 实际很少,注意到 0fi,jfi,j11,每一种合法方案差分后能唯一对应一个长度为 |s| 的二进制数。

对于子串的限制,再记录一维 k 表示匹配到 "NOI" 的哪一位即可。

预处理每种 fi1 以及 ti 会转移到哪个 fi,时间复杂度 O(2|s|n)submission

CF578D LCS Again#

题意:给定字符串 s,求满足 lcs(s,t)=n1 的字符串数量。n105

继续延续上题做法不是很牛,复杂度高达 2nn

考虑哪些状态是一定无用的。lcs(i,j)min(i,j),后缀 i,j 能匹配的最大长度是 min(ni,nj)

必须满足 min(i,j)+min(ni,nj)=n|ij|n1 才可能对答案产生贡献。

需要考虑的状态一共就三个:fi,i1, fi,i, fi,i+1

再注意到 fi,jmin(i,j)1,否则也不能产生贡献。

dpi,0/1,0/1,0/1 表示 三项分别为 {i2,i1}, {i1,i}, {i1,i} 的方案数,复杂度 O(||n)

submission

posted @   Lu_xZ  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示