Loading

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\),状压差分

posted @ 2025-07-23 00:02  lajishift  阅读(7)  评论(0)    收藏  举报