DP 杂项 tricks
本文主要介绍 dp 的一些小的技巧而不是大的方法。
状态和转移顺序
状态设计中,考虑分界线左右两侧,将一侧中的状态按照向另一侧贡献分为若干等价类,此时一个等价类就是一个状态。
可以分析状态中每一维何时有意义,找到优化方向
改变转移顺序
例题:
题面:
一个由 \(+1\),\(-1\),\(?\) 组成的序列,长度为 \(n\),每个 \(?\) 都可以变为 \(+1\) 或 \(-1\),问所有可能中最大前缀和为 \(0,1,...\) 分别多少种。\(n \leq 5 \times 10 ^ 3\)。
解法
这道题如果从 \(1\) 到 \(n\) 做 dp,则状态为 dp[i][j][k] 表示考虑前 \(i\) 个问号,最大前缀和为 \(j\),当前前缀和为 \(k\) 的答案。时间复杂度 \(O(n^3)\)。
发现当最大前缀和在后半段时,则 \(j\) 没有用;如果最大前缀和在前半段时,则 \(k\) 没有用。有优化空间。
于是考虑从后往前 dp。当前知道一个后缀的最大前缀和,在前面添加数。dp[i][j] 考虑从后往前到 \(i\),最大前缀和为 \(j\) 的答案。转移平凡。时间复杂度 \(O(n^2)\)。
状压 dp
可行性问题——边界特殊状态简化
可行性问题中,有些状态的实现难度严格比其他状态困难,如果发现困难状态实现可以推导出其他状态实现,则只保留困难状态(一般为边界状态)。
例题:P10492 Weather Forecast
题面:
题意是有一个 4 * 4 的方格图,拿着一个 2 * 2 来覆盖。每个块在一些时间不能被覆盖,所有块不能连续 7 天不覆盖。找方案。
解法:
发现四个角的覆盖是“困难状态”,只要四个角覆盖,那么中间的一定可以。
不需要记录所有位置上次覆盖的时间,只需要记录四个角即可。
把一坨 dp(i,?) 状压到一个 S
如何 dp(i,?) 单调递增 / 每次增长 \(\le 1\),状压差分

浙公网安备 33010602011771号