-
A 过水不讲。
-
B 过水不讲。
-
C 过水不讲。
-
D 背包模板,过水不讲。
-
E 由于这一题背包容量过大,但是价值很小,所以我们可以根据价值来 DP。设 fi,j 为前 i 个物品,获得 j 的价值所需要的最小容量,ans 即为满足 fn,ans≤m 的最大 ans。
-
F LCS 模板,过水不讲。
-
G 拓扑排序模板,过水不讲。
-
H 过水不讲。
-
I 设 fi,j 为前 i 枚硬币有 j 枚硬币正面朝上的概率。转移有 fi,j=pi×fi,j−1+(1−pi)×fi,j。
-
J 由于 ai 最多为 3,所以我们可以推出状态:fa,b,c 代表还剩 a 个 3 个寿司的盘子,b 个 2 个寿司的盘子,c 个 1 个寿司的盘子,有转移:
fa,b,c=na(fa−1,b+1,c+1)+nb(fa,b−1,c+1+1)+nc(fa,b,c−1+1)+nn−a−b−c(fa,b,c+1)
我们发现,这个屑转移方程会自己转移到自己,怎么办呢?给它变形。
fa,b,c=na(fa−1,b+1,c+1)+nb(fa,b−1,c+1+1)+nc(fa,b,c−1+1)+nn−a−b−cfa,b,c+nn−a−b−c
fa,b,c−nn−a−b−cfa,b,c=na(fa−1,b+1,c+1)+nb(fa,b−1,c+1+1)+nc(fa,b,c−1+1)+nn−a−b−c
na+b+cfa,b,c=na(fa−1,b+1,c+1)+nb(fa,b−1,c+1+1)+nc(fa,b,c−1+1)+nn−a−b−c
fa,b,c=a+b+cn(na(fa−1,b+1,c+1)+nb(fa,b−1,c+1+1)+nc(fa,b,c−1+1)+nn−a−b−c)
fa,b,c=a+b+ca(fa−1,b+1,c+1)+a+b+cb(fa,b−1,c+1+1)+a+b+cc(fa,b,c−1+1)+a+b+cn−a−b−c
这样就可以直接 DP 了,时间复杂度为 O(n3)。
-
K 博弈论 DP。设 fi,0/1 为堆里还剩 i 块石头,Taro / Jiro 先操作,Taro 的输赢情况。(1 表示赢)由于 Taro 想让自己尽可能地赢,所以 fi,0=⋁j=1nfi−aj,1。Jiro 想让 Taro 尽可能输(也就是让自己尽可能赢),所以 fi,1=⋀j=1nfi−aj,0。特别的,如果对于每一个 j,i−aj 都小于 0,那么要让另外一个选手赢。
-
L 博弈论,区间 DP。设 fl,r 为取到只剩区间 [l,r] 的元素,Taro 先手能获得的最大得分差,gl,r 为取到只剩区间 [l,r] 的元素,Jiro 先手能获得的最小得分差。枚举当前取走 l 还是 r,随便转移一下即可。
-
M 前缀和优化 DP。设 fi,j 为前 i 个孩子分了 j 块糖果的方案数,转移为 fi,j=∑k=j−aijfi−1,k,时间复杂度为 O(nk2),会超时。再设 sumi,j=∑k=0jfi,k,就可以做到 O(nk) 了。
-
N 原题 P1775,不讲。
-
O 状压 DP。设 fi,j 为目前给前 i 个男人配对,且女人的配对情况为 j 时方案数。枚举第 i 个男人与哪个女人配对,转移为 fi,j=∑k=1n[j&2k−1]×ai,k×fi,j⊕2k−1。时间复杂度为 O(n2×2n),会超时。
我们考虑去除无用状态。由于题目要求的是 n 个男人和 n 个女人配对的方案数,而且每个男人只能配对一个女人,所以 i=popcnt(j) 的 fi,j 都是无用状态。时间复杂度降至 O(n×2n),可以通过。
-
P 类似于没有上司的舞会,设 fu,0/1 为 u 点选 / 不选的方案数,转移为 fu,0=∏v∈son(u)fv,0+fv,1,fu,1=∏v∈son(u)fv,0(子树之间不会互相影响,满足乘法原理)。
-
Q 树状数组优化 DP(当然用线段树也可以)。设 fi 为 LIS 最后一个元素为 ai 的最大价值,可以列出转移 fi=maxj=1i−1{[ai>aj]fj}+bi。转移的限制有两个,第一个是下标的限制,第二个是 ai 的限制。第一个限制只需要在每次转移后,将 fi 插入即可。而第二个限制可以在 ai 的位置插入 fi,转移时用树状数组查询 [1,ai−1] 的前缀最大值即可。
-
R 矩阵快速幂优化递推。设 fi,j 为长度为 i,终点为 j 的路径数。有转移方程 fi,j=∑k=1nek,j×fi−1,k,时间复杂度为 O(n2K)。
我们发现这个柿子有点像矩阵乘法的形式,于是我们可以写出初始矩阵 B 为 [111⋯1](n 个 1)。然后,我们发现转移矩阵就是题目中给出的邻接矩阵 E。目标矩阵为 B×EK,答案为目标矩阵的第一行之和。
-
S 数位 DP。设 l 为 n 的位数,si 为 n 的第 (l−1) 位到第 i 位之和,fi,j,k 为目前填到第 i 位,位数和 modd 的结果,sumi,j=∑k=09fi,j,k。转移有 fi,j,k=sumi−1,((j−k)modd+d)modd。
答案可以分成两类统计:位数小于 l 的,和位数等于 l 的。
第一类为 ∑i=0l−2sumi,0−fi,0,0(前导 0 的情况不能算)。
第二类为 (∑i=0l−1∑k=[i=l−1]10inmod10−1fi,x,k)+[s0=0]。其中 x∈[0,d] 且 x+si+1≡0(modd)。意思已经很明显了,第 l−1 位到第 i+1 位都与 n 相等,数位和已经确定,现在要求的填法使得第 i 位小于 n,并且数位和与已经确定的部分之和模 d 为 0,至于 [s0=0] 就是看 n 是否符合要求。
这样统计答案可以做到不重不漏。
-
T 前缀和优化 DP。设 fi,j 为前 i 个位置填了互不相同的 i 个数,其中最后一个数在其中的排名为 j。可以列出状态转移方程 fi,j={∑k=1j−1fi−1,k∑k=jifi−1,kopi−1="<"opi−1=">"。使用前缀和优化即可。
-
U 状压 + 枚举子集。首先 O(n22n) 预处理出 score(s) 为将 s 内的兔子分到一组的得分。然后设 fi 为兔子选择状态为 i 时的最大得分。(选择的兔子分成了若干组)转移为 fi=maxj∈i{fi−j+score(s)}。总时间复杂度为 O(n22n+3n)。
-
V 换根 DP。设 fu 为 u 节点染色,以 u 为根的子树的方案数,gu 为 u 节点涂色,以 u 为根的剩余部分方案数,那么 u 节点的答案就是 fu×gu。有转移 fu=∏v∈son(u)fv+1。
接下来我们考虑一次换根求出 g。首先,g1=1。然后,gv=(gu×∏p∈son(p)&p=vfp)+1。如果我们暴力枚举 p,时间复杂度会被菊花图卡成 O(n2)。我们可以预处理出 fv 的前缀积和后缀积,就可以 O(1) 算出 ∏ 部分了。
-
W 线段树优化 DP。设 fj 为最后一个 1 在 j 位置的最大得分。由于贡献不太好算,所以我们考虑在每一个区间的右端点处加上这个区间的贡献。得出转移 fi=maxj=0i−1{fj},fj→fj+∑rk=i&lk≤jak 第一个转移是个区间最值问题,第二个转移是个区间加,用线段树维护即可。
-
X 排序确定 DP 顺序。可以用邻项交换法证明,以 si+wi 小的块应该放在 si+wi 大的块上面。排序后,设 fi,j 为用前 i 个方块建出的塔重量为 j 时塔的最大价值,有转移 fi,j=max(fi−1,j,fi−1,j−wi+vi) (wi≤j≤si+wi)。
-
Y 因为白格子数量巨大,而黑格子最多只有 3×103 个,应该思考按照黑格子计数的方式。
首先将黑格子按照 x,y 排序,然后设 fi 为从 (1,1) 走到第 i 个黑格子,且中途不经过其他黑格子的方案数。从 (1,1) 走到 (x,y) 的方案数显然是 Cx+y−2x−1(或 Cx+y−2y−1),我们可以用它减去至少经过一个黑格子的方案,就得到了 fi。显然可以枚举经过的第一个黑格子,由于经过的第一个黑格子不同,这两条路线就不同,所以可以做到计数不重复。
-
Z 听说是斜率优化,我不会(