DP套DP

例题

CF578D

这题我们采用 $\text{DP}$ 套 $\text{DP}$ 解决。

首先,我们先考虑 $\text{DP}$ 求 $\text{LCS}$ 的过程。

F[i][j]=max(F[i-1][j],F[i][j-1],F[i-1][j-1]+(S[i]==T[j]);

有结论:$F_{i,j} \le \min(i,j)$。

我们注意到最终要求 $\text{LCS}=n-1$,且有此结论,那么 $|i-j| \ge 2$ 就不必考虑了。

我们记内部 $\text{DP}$ 的 $g_{i,j}$ 表示 $T$ 字符串的前 $i$ 个字符与 $S$ 的前 $j$ 个字符的 $\text{LCS}$,那么照着上述求 $\text{LCS}$ 的方法有如下对应的式子:

g[i][j]=max(g[i-1][j],g[i][j-1],g[i-1][j-1]+(T[i]==S[j]));

我们再记外部 $\text{DP}$ 的 $f_{i,a=0/1,b=0/1/2,c=0/1}$ 表示 $\text{T}$ 的前 $i$ 个字符满足如下条件的方案:

  • $g_{i,i-1}=i-2+a$。
  • $g_{i,i}=i-2+b$。
  • $g_{i,i+1}=i-1+c$。

我们可以通过刷表法转移,转移的时候,先还原出 $g$ 数组,再还原出三个下标 $x,y,z$,进行转移 $f_{i,x,y,z}=f_{i,x,y,z}+f_{i,a,b,c}$,时间复杂度 $O(12nm)$。

代码

CF gym 102759 G

不妨先看一道极为相似的题。题意:给出一个长度为 $n(n \le 15)$ 的字符串 $s$,问有多少场为 $n$ 的字符串 $t$ 和他的 $\text{LCS}$ 恰好为 $len$($s$ 和 $t$ 都只包含大写字母)。

我们还是和上题一样,考虑 $\text{DP}$ 求 $\text{LCS}$ 的过程。

F[i][j]=max(F[i-1][j],F[i][j-1],F[i-1][j-1]+(S[i]==T[j]);

有结论:$0 \le F_{i,j} - F_{i,j-1} \le 1$。

那么我们便可以设计出 $\text{DP}$ 套 $\text{DP}$ 的内外层状态:内层不变,外层第一维度 $i$ 不变,后面的变成一个状压的维度,转而记录一整行所有 $g_{i,j}-g_{i,j-1}$,转移同理(第二维也同样是一个长为 $n$ 的 $01$ 串)。

我们再回到当前这题来,我们对于 $|i-j| \le k$ 的状态是合法的,其余的不合法,那么这样的状态共有 $2k+1$ 个,我们不妨把 $\text{LCS}(i,i)$ 单独记,再用一维,记录的是离 $i$ 差几(注意到不超过 $k$)。

[ZJOI2019]麻将

首先,必须先考虑一副牌是否是“胡”的,不然解决这道期望题就是无稽之谈。所以我们可以先把 $7$ 个对子的特殊情况判掉,接下来用 $\text{DP}$ 判断 $1$ 个对子、$4$ 个面子的情况。

用 $f_{i,j,k,t}$ 表示考虑了前 $i$ 种牌,是否已经有对子了($j=0$ 表示否,$j=1$ 表示是),多余的像 $i,i-1$ 这样的一组牌有 $k$ 组,多余的第 $i$ 种牌有 $t$ 个的情况下,最大产生的面子数量。

接下来来回到这道题。设 $X$ 表示最早产生胡牌的轮数的随机变量,$p(x)$ 表示恰好 $x$ 轮时第一次产生了胡牌的概率。$$ E(X)=\sum_{x=0}^{4n-13} x \times p(x) $$

$$ E(X)=\sum_{x=0}^{4n-13} \sum_{i=0}^{n-1} \times p(x) $$

$$ E(X)=\sum_{i=0}^{4n-13} \sum_{x=i+1}^{4n-13} \times p(x) $$

$$ E(X)=\sum_{i=0}^{4n-13} P(\text{x轮时还没有胡牌的概率}) $$

$$ E(x)=\sum_{i=0}^{4n-13} \frac{\text{x轮时还没有胡牌的方案数}}{C_{4n-13}^i} $$

所以我们的重中之重就是求出 $x$ 轮还没有胡牌的方案数。

我们使用 $\text{DP}$ 套 $\text{DP}$ 解决此问题。我们把上述简易 $\text{DP}$ 的状态和其对应的对子数量作为内层 $\text{DP}$ 状态给压缩起来(注意 $i$ 那维不要压进去,我们将会把那一维单独地放入外层的状态里),我们发现实际有用的状态可能很少,故而用搜索找。那么我们外层的状态就显而易见了:$dp_{i,j,k}$ 表示前 $i$ 种牌,内层状态为 $j$,总共选了 $k$ 张的方案数。

至于查询没有胡牌的方案数,只需要判断加求和就行了。

CF979E

本题采用 $\text{DP}$ 套 $\text{DP}$。

首先,我们考虑怎么在确定所有点颜色且确定所有连边的情况下算方案数。不难发现可以采用 $\text{DAG}$ 上 $\text{DP}$。

令 $g_i$ 表示以 $i$ 开头的路径数量,那么他可以从所有颜色和他不同的点转移过来。转移顺序的话按照 $\text{DAG}$ 的反图上的拓扑顺序来。

再考虑外层 $\text{DP}$。令 $f_{i,j,k,t}$ 表示以 $i$ 到 $n$ 中,总路径条数的为奇数/偶数($j=0$ 为奇数,$j=1$ 为偶数),存在/不存在 $g_x \equiv 1 \pmod{2}$ 的黑点($k=0$ 表示不存在,$k=1$ 则反之),存在/不存在 $g_x \equiv 1 \pmod{2}$ 为奇数的白点($t=0$ 表示不存在,$t=1$ 则反之)的方案数。

转移的话就很简单,我们枚举可以选的颜色,然后挑选一个其它颜色且 $g_x \equiv 1 \pmod{2}$ 的点用来协调整奇偶性,其它点可以有选/不选两种方案。若没有这样一个点,那么当前点开头路径数的奇偶性只能为奇数(注意当前点本身也算一条路径)。

代码

posted @ 2023-04-30 18:02  徐子洋  阅读(19)  评论(0)    收藏  举报  来源