Loading

ATcoder dp

link

A

这种就是最典型有阶段,没法贪心的问题。\(f_i\) 表示考虑到第 \(i\) 个石头的答案。\(f_i = \min(f_{i-1}+v(i-1,i), f_{i-2}+v(i-2,i))\)

B

和 A 一样的不写了。如果 \(k\) 比较大应该可以权值线段树优化转移。

C

一维记不下就开二维。\(f_{i,0/1/2}\) 表示考虑到第 \(i\) 天,选择了哪种活动。分类讨论转移即可。

D

背包问题。总是被干爆所以写详细一点。设 \(f_{i,j}\) 表示考虑到第 \(i\) 个物品,用的空间 \(\le j\) 的最大价值,\(f_{i,j} = \begin{cases} f_{i-1,j} \\ f_{i-1,j-w_i}+v_i \ \ (j\ge w_i) \end{cases}\)

发现可以压掉一维,因为你一个物品只能用一次,所以不能用 \(f_{i,j-w_i}\) 的转移,要从后往前枚举转移。

背包问题的 dp 想法是非常常见的。第二维可以表示你要求限制的东西。

ex : 在 \(n\)\((a_i,b_i)\) 中选出若干个使得 \(\gcd(a_i)=1\) 的同时最小化 \(\sum b_i\)

sol : 考虑把上面那个的第二维改成当前的 \(\gcd\),由于 \(\gcd\) 比较少,直接套个 umap 转移即可。

E

简单 trick,考虑把上面那个东西的第二维和答案换一下,\(f_{i,j}\) 表示考虑到第 \(i\) 个物品,价值为 \(j\) 的最小空间。该怎么转移怎么转移。

F

\(f_{i,j}\) 表示考虑 \(s\)\(i\)\(t\)\(j\) 的答案。\(f_{i,j}=\max\begin{cases} f_{i-1,j}\\ f_{i,j-1}\\ f_{i-1,j-1}+1 \ \ (s_i = t_j) \end{cases}\),输出答案就看决策在哪边就行了。

G

变成拓扑序之后就有转移阶段了,\(f_u = \max\limits_{v\in G_u}f_v+1\)

H

\(f_{i,j}\) 表示当前在 \((i,j)\) 的答案,转移的时候判掉障碍即可。

上面的题其实都没写代码(


上面权当练习 \(\LaTeX\) 了,下面是正题。

I

你直接计算这个胜率是不太现实的,设 \(f_{i,j}\) 表示前 \(i\) 次,硬币向上有 \(j\) 次,\(f_{i,j} = p_if_{i-1,j-1} + (1-p_i)f_{i-1,j}\)

J

期望会不了一点啊。期望有一个可加(线性)性,所以你可以递推求和,把每一步的期望加起来。设 \(f_{i,j,k}\) 表示还有 \(i\) 个剩 \(1\)\(j\) 个剩 \(2\)\(k\) 个剩 \(3\)\(n-i-j-k\) 个剩 \(0\),整理一下可以得到 \(f_{i,j,k} = \dfrac{1}{i+j+k}(if_{i-1,j,k}+jf_{i+1,j-1,k}+kf_{i,j+1,k-1}+n)\)。递推的时候按 \(k,j,i\) 的顺序转移消除后效性。然后期望 dp 还有要做一个事情是从结果反推开头。

K

公平组合游戏。\(f_i=0/1\) 表示你操作 \(i\) 时必败/必胜,显然对于 \(x\) 如果 \(\exists f_{x-a_i} = 0\),那么 \(f_x=1\),初始状态 \(f_{0}=0\) 递推即可。同时,如果 \(\forall f_{x-a_i}=1\),那么 \(f_x=0\),不过这并没有什么必要,因为你初始都是 0。

L

dp 最优化博弈。设 \(f_{l,r}\) 表示 \([l,r]\) 的答案。转移考虑取两边,如果长度为奇数,答案尽量大,取 max 转移,否则,答案尽量小,取 min 转移。

M

先暴力设 \(f_{i,j}\) 表示前 \(i\) 个人,吃了 \(j\) 颗糖,暴力转移
\(\displaystyle f_{i,j}=\begin{cases} \sum_{k=0}^{j}f_{i-1,j} \ \ (j \le a_i)\\ \sum_{k=0}^{a_i} f_{i-1,j-k} \ \ (j > a_i) \end{cases}\)
显然的前缀和形式,优化完就是 \(O(nk)\) 的。可以滚掉一维。

N

这种和区间扩展/缩小有关的考虑区间 dp。设 \(f_{l,r}\) 表示 \([l,r]\) 的答案。枚举断点 \(f_{l,r} = \min(f_{l,k}+f_{k+1,r}+s(l,r))\)\(s\) 为前缀和,预处理即可。

O

这个数据范围考虑状压。设 \(f_{i,s}\) 表示考虑前 \(i\) 个左部点,匹配的右部点状态为 \(s\),每次转移 \(popc(s) = i\) 的状态,\(f_{i,s} \gets f_{i-1,s\oplus 1<<j} (j \in s \wedge j \in G_i)\)。然后就过了,看眼题解似乎可以优化一下复杂度。发现第一维不仅可以滚掉,并且还能被 \(s\) 表示出来,那让 \(i = popc(s)\),时间复杂度和空间复杂度都少了一个 \(n\)

P

树形 dp。设 \(f_{u,0/1}\) 表示以 \(u\) 为根的答案,\(u\) 是黑/白。运用合并儿子信息的想法,设 \(v \in son_u\),分类讨论转移 \(f_{u,0}=\prod f_{v,1}, f_{u,1}=\prod (f_{v,0}+f_{v,1})\)

Q

\(f_i\) 表示考虑到 \(i\),强制以 \(i\) 结尾的答案。暴力转移 \(f_{i}=\max\limits_{h_j < h_i} f_j + a_i\)。直接树状数组优化转移即可。

R

考虑设 \(f_{x,i,j}\) 表示 \(i\to j\) 长度为 \(x\) 的路径数。有 \(\displaystyle f_{x,i,j} = \sum_{k=1}^{n} f_{x-1,i,k} \times f_{1,k,j}\),发现这个就是矩阵快速幂优化的形式,\(T_x=T_{x-1}\times T_1\),于是 \(T_k=T_1^k\)。直接套上去就对了。

S

数位 dp。设计 dfs(i, now, lim) 表示当前考虑从后往前考虑到第 \(i\) 位,当前余数为 \(now\),是否有顶数字上界。暴力转移,记忆化即可。


以下是较有难度的题目。

T

直观感受会设 \(f_{i,j}\) 表示考虑到 \(i\)\(i\) 填了 \(j\) 的方案数,但是你这样需要保证 \(j\) 没有被填过,于是转而设状态表示当前 \(i\) 排名为 \(j\)。暴力转移 \(f_{i,j}=\begin{cases} \sum_{k=1}^{j-1}f_{i-1,k} \ \ (s_{i-1}=\texttt{<})\\ \sum_{k=j}^{i-1}f_{i-1,k} \ \ (s_{i-1}=\texttt{>}) \end{cases}\),直接前缀和优化转移即可。

U

状压首先考虑 \(f_s\) 表示考虑到状态 \(s\) 的答案,死去的背包开始攻击我,转移就是 \(f_s = \max\limits_{t \in s}f_t+f_{s\oplus t}\)

V

首先这是 dp,其次你要对所有节点求答案,考虑换根 dp,首先有 \(f_u = \prod\limits_{v\in son_u}(f_v+1)\),然后考虑换根造成的影响,他的父亲变成了他的儿子,那么 \(fa\) 少了一个儿子,\(f_{fa} = \dfrac{f_{fa}}{f_u+1}\)\(u\) 多了一个儿子,\(f_{u} = {f_u} \times (f_{fa}+1)\)。没法求逆元所以用前缀和后缀乘积拼起来。

W

考虑设 \(f_i\) 表示考虑到 \(i\) 强制在 \(i\) 放 1,暴力转移有 \(\displaystyle f_{i} = \max(f_{j-1} + \sum_{j \le l_k\le i\le r_k}a_k)\)。考虑线段树优化,在线段树上放 \(f + \sum\),然后扫描线,扫到 \(r_k\) 加上 \([l_k,r_k]\) 的贡献 \(a_k\) 来维护 \(\sum\)\(f\) 就是全局最大值。

X

发现很像一个背包问题,但问题就在还有 \(s\) 的限制。考虑排序解决这一维,然后自然想到邻项交换贪心,考虑剩余的承重能力,如果 \(i\)\(j\) 上面,\(s_i-w_j < s_j-w_i\),即 \(s_i+w_i < s_j+w_j\)。然后设 \(f_{i,j}\) 表示考虑前 \(i\) 个,使用重量 \(\le j\) 的答案。选择 \(i\) 的转移时要注意重量不能超过承重。

Y

地图很大肯定不能直接 dp,但是障碍很少,考虑用总方案减去不合法方案,设 \(d((x1,y1) \to (x2,y2)) = \binom{x2-x1+y2-y1}{x2-x1}\),表示 \((x1,y1) \to (x2,y2)\) 的路径数,设 \(f_i\) 表示走到第 1 个遇到的障碍是障碍 \(i\) 的路径数,则 \(f_i = d((x_i,y_i) \to (n,m))g_i\),其中 \(g_i\) 表示第一个遇到的障碍是障碍 \(i\) 的方案数。有 \(\displaystyle g_i = d(1,1,x_i,y_i) - \sum_{x_j<x_i \wedge y_j<y_i}d(x_j,y_j,x_i,y_i)g_j\),为了保证转移无后效性按 \(x\) 排序。答案即为 \(\displaystyle d(1,1,n,m) - \sum f_i\)

Z

先暴力 dp \(f_i = \min(f_j + h_i^2+h_j^2-2h_ih_j+c)\),这个式子有 \(i,j\) 相乘的项,考虑去凑斜率优化的形式。当 \(j\) 为最优决策点时,有 \(f_i-h_i^2-c=-2h_ih_j+f_j+h_j^2\),此时 \(b = f_i-h_i^2-c,k=2h_i,x=h_j,y=f_j+h_j^2\)\(k\) 单增,要求 \(b\) 最小,单调队列维护一个下凸壳即可。这个压轴题也太板了一点。

posted @ 2025-02-22 22:05  VitrelosTia  阅读(72)  评论(0)    收藏  举报