Some DP

*[ABC213G] Connectivity 2

2600

\(f(S)\) 表示连通子图为 \(S\) 的个数,\(g(S)\) 表示子图为 \(S\) 的个数。

\(g\) 很好求,我们最终的答案可以根据 \(f, g\) 得出,所以我们需要算 \(f\)

考虑整体减空白,我们找一个点 \(v \in S\),计算:

\[f(S) = g(S) - \sum_{v \in T \sub S}f(T)f(S/T) \]

即可。

提交记录

CF482C Game with Strings

2600

首先一眼绿豆蛙的归宿,难点在于求终止状态。

我们先枚举答案是哪个字符串,然后计算 \(B_S\) 表示用与这个字符串相同位置恰好为 \(S\) 的个数,我们需要求的就是 \(A_S = \sum_{T \sube S}B_T\) 表示当走到 \(S\) 时,我们还剩多少选择。

显然这个不好做,但是我们定义 \(S\) 变成原来的补集就可以用 SOSDP 求解了,时间复杂度 \(O(n2^n)\)

但是当前由于枚举答案,时间复杂度 \(o(nm2^m)\),过不了。

于是我们考虑将所有状态和为一起,定义 \(f(S)\) 表示每个作为答案概率一样,从 \(S\) 走到终点的期望步数。

我们本来是 \(f(S) = \frac{1}{m - popcount(S)}\sum_{T = S + \{v\}, v \not \in S}(f(T) + 1)\),现在由于计算所有,假设我们有 \(k\) 个还能走下去,我们就将加上的 \(1\) 换成 \(\frac{k}{n}\) 即可。

而前面的 SOSDP 用位运算合并,求或的前缀和即可。

时间复杂度 \(O(m2^m)\)

提交记录

posted @ 2024-07-19 15:54  rlc202204  阅读(8)  评论(0编辑  收藏  举报