ZhengRuiOI 题目整理
Day 1
状压 DP
AT_dp_o
显然。
实际上这题正确的复杂度应该是 \(O(n2^n)\)。
但是经过简单剪枝的 \(O(n^22^n)\) 也可过。
QOJ 9619
我们随机拆下式子:
然后这个东西硬来非常难做,我们考虑规避直接算 \(a_i\),转向对于质因数子集算贡献。
我们考虑设 \(f_S\) 代表:
且这里的 \(a_i\) 的质因子的并集为 \(S\)。那么我们有转移:
其中 \(T\) 是 \(a_i\) 对应的质因数集合,这样子时间复杂度是 \(\mathcal{O}(n2^{\pi(m)})\),其中 \(m\) 是值域。这是暴力的。
这里有一个细节值得注意:\(S\) 要倒序枚举。正序枚举会造成重复计算。比如说 \(f_{\{2\}}\) 和 \(f_{\{3\}}\) 已经分别被 \(2, 3\) 贡献,然后再枚举到 \(f_{\{2, 3\}}\) 时,它不仅会算上 \(f_{\{2\}}\) 和 \(f_{\{3\}}\) 的贡献,还会再被 \(2, 3\) 贡献,就重复贡献了。倒着做之所以是对的其实也很简单:因为状压后 \(S\cup T \ge S\),因此在 \(S\cup T\) 不会被同一个 \(S\) 贡献多次,其实本质上是一个组合型枚举。
我们考虑优化。
注意到每个数 \(\ge \sqrt{m}\) 的质因数最多只能有一个,考虑根号分治。然后就很简单了,只是需要多记录一个 \(g_S\) 辅助转移,定义和 \(f_S\) 差不多。
时间复杂度 \(\mathcal{O}(\pi(m) 2^{\pi(\sqrt{m})})\)。
P1896
这题有很多种做法。
-
做法一,暴力。设 \(f_{i, j, S}\) 第 \(i\) 行放了 \(S\),总共用了 \(j\) 个国王,\(\mathcal{O}( 4^n n^4)\),精细实现 \(\mathcal{O}( 4^n n^3)\)。
-
做法二,上面的 \(S\) 转移时不交,所以枚举子补集 \(\mathcal{O}(3^nn^2)\)。
-
做法三,上面的 \(S\) 转移时状态数是斐波那契数列级别的,所以枚举子补集 \(\mathcal{O}(2.6^nn^3)\)。
具体来说就是注意到一行中不可能存在两个相邻的 \(1\),我们把这些合法的状态预处理出来,每次只转移这些状态,具体的级别就 \(f_i = f_{i - 1} + f_{i - 2}\) (分别是填 \(1\) 或填 \(0\))。
-
做法四,轮廓线 DP,\(\mathcal{O}(2^{n + 1}n^4)\)。
P5074 \(/\) HDU1693
轮廓线 DP。感觉讲的不太清楚,反正是板子题,不管了。
HDU6984
做法一:
- \(k \ge \sqrt{n}\) 按 \(\bmod k\) 去填,是 \(2^\frac{n}{k}\)。
- \(k\le \sqrt{n}\) 把最后 \(k\) 个压进状态里,暴力转移,有一个 \(2^k\) 的系数。
- 但是这个做法很不优,有些细节。
做法二:
- 我们换一种理解,把 \(1\sim k\) 分成一行,把 \(k + 1\sim 2k\) 分成一行,以此类推。
- 然后轮廓线 DP 来处理这个条件。
- 状态数只有斐波那数大小,可以更优秀的复杂度。
P4590
类似轮廓线,但是存的是 LCS 的 DP 数组,这种技巧被称为 DP 套 DP。
从前往后验证整个串的答案,类似自动机的思想来构造状态和转移。
数位 DP
P4127
经典数字和按同余。

浙公网安备 33010602011771号