DP新解与DP套DP技术
先简单介绍一下理解DP的另一个角度.
假设我们要处理一个问题,无论是最优化或是计数问题.搜索的策略是,枚举所有可能的情况,因此复杂度通常为指数级;DP的策略是,将满足某种”共同特征”的所有方案看作一个整体状态,只保留这个整体的最优值/方案数/概率期望 等信息,并通过已知状态推出其他状态,若这种”共同特征”确定得当,则复杂度便可降为多项式级别.
譬如在背包问题中,对于体积和为x的所有方案,我们只保存其最优值.
此外,这种理解也符合计数DP也算DP,而单纯的斐波那契数列递推等不算DP这个预期.
下面谈一谈DP套DP技术.这里以「ZJOI2019」麻将 为例.
首先,对所有可能的麻将排列,我们只关注麻将的数量,以及这些麻将是否(存在一个子集)能胡.但是,发现对于两组麻将,很难确定一个”共同特征”.
这是因为,判定麻将是否能胡,并不是极为容易.事实上仅仅是判定,我们就需要一个DP.
比如,设f(i,x,y,0/1)表示考虑到第i种牌,第i−1种牌还剩x张,第i种牌还剩y张,且有/没有 对子时最大的面子数量,g(i)表示考虑到第i张牌,不同的对子数量.或者也可以设f(i,x,y,0/1)表示考虑到第i张牌,且i−1开头的顺子有x个,i开头的顺子有y个,且有/没有 对子时最大的面子数量,g(i)同上.最后若存在一种方案满足有对子且面子至少4个,或者有至少七对对子即可胡. 两种DP都可行,只有常数上的差距.
首先忽略i,对后续转移没有影响;对于两组麻将P,Q,若∀(x,y,k),fP(x,y,k)=fQ(x,y,k),gp=gQ(fP表示对P做上述DP得到的结果,fQ同理),那么无论之后接上什么麻将,之后的DP值都相同,是否胡牌当然也相同了.那么可以尝试,将这个DP的内容,做为一个”共同特征”.可惜的是这样做复杂度难以接受:可能的DP值数量太多,作为状态会导致复杂度无法接受.
我们再从另外一个视角看DP.设给定一个输入序列P,求得fP.现在要在P后加入一个元素x,求得fP+x.其实就是从一个状态走到了另一个状态,宏观上看恰如DFA(DFA即确定性有限状态自动机,不熟悉的读者可参考网上资料或参考文献1)上从一个点走到另一个点.说的详细些就是,对这个DP,我们有一个DFA,DP每一种可能的状态都对应DFA上的一个点,DP的转移对应DFA的边,对于给定的输入序列P,就是从DFA的起始状态开始走,经过一条链最终走到一个节点,其代表的状态就是我们所求.
对这样一个判断是否能胡的DP,我们也建立一个DFA.所有可能的麻将序列都对应DFA上一条链.另外维护一下每个点能不能胡.这样做的意义在于,虽然可能的麻将序列,可能的DP值数量很多,但若钦定f的值不超过4,g的值不超过7,这个DFA的节点却比较少:根据实现方法不同,有1500~4000个点(但似乎用第一种DP可能会有9000+的点?)
于是,我们可以直接用DFA的点来表示一个DP状态了.最后求答案的DP是,f(i,j,p)表示考虑前i种牌,选了j张,对应在DFA的节点p时的方案数.转移时枚举i种选了几张即可(注意同种牌中也是有编号的,还要乘上选出几张的组合数).将第j张牌才胡(贡献应为j)转化为1…j张牌都有1的贡献,答案为:
∑4nj=14∑p∉Winf(n,j,p)(j−13)!(n−j)!(4n−13)!
时间复杂度O(n2m),m为DFA的节点数.这种技术称为DP套DP技术.
此外,徐哲安学长指出,通过DFA最小化技术,可以将DFA缩小至只有200~300个点,详情可见其论文(参考文献1)
参考文献:
- 徐哲安,浅谈有限状态自动机及其应用,2021年集训队论文
是我看不懂的东西了