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_{u,1}, f_{u,1}=\prod (f_{u,0}+f_{u,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} + f_{1,k,j}\),发现这个就是矩阵快速幂优化的形式,直接套上去就对了。
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\) 最小,单调队列维护一个下凸壳即可。这个压轴题也太板了一点。