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)\)。