ZhengRuiOI 题目整理

Day 1

状压 DP

AT_dp_o

显然。

实际上这题正确的复杂度应该是 \(O(n2^n)\)

但是经过简单剪枝的 \(O(n^22^n)\) 也可过。

QOJ 9619

我们随机拆下式子:

\[\sum \varphi\left (\prod a_i\right ) = \sum \prod_{p|\prod a_i} \frac{p - 1}{p} \prod a_i \]

然后这个东西硬来非常难做,我们考虑规避直接算 \(a_i\),转向对于质因数子集算贡献。

我们考虑设 \(f_S\) 代表:

\[\sum_{G = \{i_1, i_2, \ldots,i_k\}} \prod_{p \in S} \frac{p - 1}{p} \prod_{i \in G} a_i \]

且这里的 \(a_i\) 的质因子的并集为 \(S\)。那么我们有转移:

\[f_{S\ \cup\ T} \leftarrow f_{S\ \cup\ T} + f_{S}\times a_i \]

其中 \(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

经典数字和按同余。

CF1994G

CF1290F

AT_arc085_d [ARC085F]

决策单调性优化

posted @ 2025-07-30 12:20  Drifty  阅读(31)  评论(0)    收藏  举报