AT_dp 26 题
AT_dp 26 题
A.Frog 1
直接 dp。设 \(f_i\) 表示调到石头 \(i\) 的最小费用,则有
B.Frog 2
上一题的升级版,同样设 \(f_i\) 表示调到石头 \(i\) 的最小费用,则有
C.Vacation
设 \(f_{i,0/1/2}\) 表示第 \(i\) 天游泳/捉虫/写作业能获得的最大幸福值,则有
D.Knapsack 1
01 背包。设 \(f_{i,j}\) 表示前 \(i\) 个物品组成体积为 \(j\) 的背包的最大价值,则有
可以将 \(i\) 这一维去掉,则变为
注意:\(j\) 要反向枚举,因为我们在更新 \(f_j\) 的时候是用的是原本的 \(f_{j-w_i}\)。
E.Knapsack 2
设 \(f_{i,j}\) 表示前 \(i\) 个物品组成价值为 \(j\) 的背包的最小体积,则有
可以将 \(i\) 这一维去掉,则变为
同上,\(j\) 也要反向枚举。
F.LCS
设 \(f_{i,j}\) 表示字符串 \(s\) 的前 \(i\) 位和字符串 \(t\) 的前 \(j\) 位的最长公共子序列长度,则有
现在还要求出最长公共子序列,于是可以从 \(f_{n,m}\) 倒推回 \(f_{1,1}\),并记录最长公共子序列。
G.Longest Path
DAG 上求最长路。设 \(f_i\) 表示到点 \(i\) 的最长路,则有
H.Grid 1
设 \(f_{i,j}\) 表示到位置 \((i,j)\) 的方案数,则有
I.Coins
设 \(f_{i,j}\) 表示前 \(i\) 个硬币,有 \(j\) 个朝上的概率,则有
可以将 \(i\) 这一维去掉,则变为
同理,\(j\) 也要反向枚举。
J.Sushi
先考虑倒推。
设 \(f_{i,j,k,l}\) 表示剩0/1/2/3个寿司的盘子有 \(i/j/k/l\) 个,变成输入状态所需的期望步数,则有,
整理得:
因为 \(i+j+k+l=n\),所以可以将 \(i\) 的一维去掉,则有
K.Stones
设 \(f_i\) 表示有 \(i\) 个石头时是否有必胜策略,则有
L.Deque
区间 dp。设 \(f_{l,r}\) 表示剩余 \(l\) 到 \(r\) 之间的数的最大差值,则分为两种情况:
-
\((n-len)\bmod2=0\),即太郎先手,则有
\[f_{l,r}=\max(f_{l+1,r}+a_l,f_{l,r-1}+a_r) \] -
\((n-len)\bmod2=1\),即次郎先手,则有
\[f_{l,r}=\min(f_{l+1,r}-a_l,f_{l,r-1}-a_r) \]
M.Candies
设 \(f_{i,j}\) 表示前 \(i\) 个人分 \(j\) 个糖果的方案数,则有
然后可以利用前缀和预处理出
则可以优化为
N.Slimes
区间 dp。设 \(f_{l,r}\) 表示区间 \(l\) 到 \(r\) 之间合并的最小代价,则有
O.Matching
状压 dp。设 \(f_{i,s}\) 表示前 \(i\) 个男性和女性集合中状态为 \(s\) 的匹配,转移枚举第 \(i\) 个男性与哪一个女性匹配,则有
P.Independent Set
树形 dp。设 \(f_{i,0/1}\) 表示第 \(i\) 个节点染成白/黑色,子树内的染色方案,则有
Q.Flowers
设 \(f_i\) 表示以 \(i\) 结尾的最大权值和,则有
可以用权值树状数组优化,设树状数组的 \(t_i\) 表示满足 \(h_j=i\) 的最大的 \(f_j\) 即可。
R.Walk
设 \(f_{i, j, t}\) 表示从 \(i\) 到 \(j\) 的路径中长度为 \(t\) 的路径条数,则有
然后发现它类似于矩乘的式子,则可以用矩乘优化。设 \(f_t\) 表示长度为 \(t\) 时的矩阵,则有
S.Digit Sum
设 \(f_{i,j}\) 表示前 \(i\) 位在任意填的情况下,模 \(m\) 的值为 \(j\) 的方案数,则有
然后设 \(g_{i,j}\) 表示前 \(i\) 位填数不能超过 \(n\) 的情况下,模 \(m\) 的值为 \(j\) 的方案数,则有
T.Permutation
设 \(f_{i,j}\) 表示填充前 \(i\) 位,且第 \(i\) 位上的数为 \(j\) 的方案数,则有
然后前缀和优化即可。
U.Grouping
设 \(f_s\) 表示集合为 \(s\) 的物品分组的最大得分,则可以分成两个集合转移,或直接计算,即
V.Subtree
假设当前的根为 \(rt\),那么可以设 \(f_i\) 表示 \(i\) 的子树内 \(i\) 为黑色的黑色连通块方案数,则有
所以 \(rt\) 的答案为 \(f_{rt}\)。但若对于每个点都这么做,会达到 \(O(n^2)\) 的时间复杂度,所以考虑换根 dp。
假设当前已经求出 \(i\) 的父亲 \(fa\) 的答案为 \(g_{fa}\),则有
其中 \(g_i\) 为 \(i\) 的答案。
但是因为有模数,所以不能用除法,要预处理前缀积与后缀积,然后直接相乘。
W.Intervals
设 \(f_{i,j}\) 表示前 \(i\) 个位置,最后一个 1 在 \(j\) 位置的最大分数,则有
观察到有很多 \(f\) 之的更新都用到了同一个命令,而且我们发现每一个命令影响的是一个区间,所以我们可以将 \(f\) 值丢到线段树上,然后进行区间加。
而对于 \(i=j\) 的更新时在 \([1,i-1]\) 中取最大值,所以还要进行额外更新。注意到 \(i\) 及其后面的尚未更新,所以可以调用全局最大值。
X.Tower
一眼背包。先排序,若 \(i\) 要在 \(j\) 的上方,则把 \(i\) 放在 \(j\) 的上方的剩余空间要大于把 \(j\) 放在 \(i\) 的上方的剩余空间,则 \(s_j-w_i>s_i-w_j\)。移项得,\(s_i+w_i<s_j+w_j\)。
设 \(f_{i,j}\) 表示前 \(i\) 个箱子,重量和为 \(j\) 的最大价值,则有
将 \(i\) 这一维去掉后,则有
易得 \(j\) 也要反向枚举。
但重量和是 \(10^7\) 级别的,仍需优化。
可以发现重量和一定会小于等于 \(s_i+w_i\),所以可以优化为 \(10^4\) 级别。
Y.Grid 2
首先,易得从 \((x_1,y_1)\) 到 \((x_2,y_2)\) 的路径方案数为 \(\binom{x_1+y_1-x_2-y_2}{x_1-x_2}\)。
设 \(f_i\) 表示到达第 \(i\) 个障碍,且不经过其他障碍的方案数,则有
如果把点 \((h,w)\) 看做第 \(n+1\) 个障碍,则答案就为 \(f_{n+1}\)。
Z.Frog 3
设 \(f_i\) 表示跳到石头 \(i\) 的最小花费,则有
暴力拆平方得
整理得
现在想要让截距最小,所以可以对点 \((h_j,f_j+h_j^2)\) 维护下凸壳。