• A 过水不讲。

  • B 过水不讲。

  • C 过水不讲。

  • D 背包模板,过水不讲。

  • E 由于这一题背包容量过大,但是价值很小,所以我们可以根据价值来 DP。设 fi,jf_{i, j} 为前 ii 个物品,获得 jj 的价值所需要的最小容量,ansans 即为满足 fn,ansmf_{n, ans} \le m 的最大 ansans

  • F LCS 模板,过水不讲。

  • G 拓扑排序模板,过水不讲。

  • H 过水不讲。

  • I 设 fi,jf_{i, j} 为前 ii 枚硬币有 jj 枚硬币正面朝上的概率。转移有 fi,j=pi×fi,j1+(1pi)×fi,jf_{i, j} = p_i \times f_{i, j - 1} + (1 - p_i) \times f_{i, j}

  • J 由于 aia_i 最多为 33,所以我们可以推出状态:fa,b,cf_{a, b, c} 代表还剩 aa33 个寿司的盘子,bb22 个寿司的盘子,cc11 个寿司的盘子,有转移:

fa,b,c=an(fa1,b+1,c+1)+bn(fa,b1,c+1+1)+cn(fa,b,c1+1)+nabcn(fa,b,c+1)f_{a, b, c} = \frac{a}{n}(f_{a - 1, b + 1, c} + 1) + \frac{b}{n}(f_{a, b - 1, c + 1} + 1) + \frac{c}{n}(f_{a, b, c - 1} + 1) + \frac{n - a - b - c}{n}(f_{a, b, c} + 1)

我们发现,这个屑转移方程会自己转移到自己,怎么办呢?给它变形。

fa,b,c=an(fa1,b+1,c+1)+bn(fa,b1,c+1+1)+cn(fa,b,c1+1)+nabcnfa,b,c+nabcnf_{a, b, c} = \frac{a}{n}(f_{a - 1, b + 1, c} + 1) + \frac{b}{n}(f_{a, b - 1, c + 1} + 1) + \frac{c}{n}(f_{a, b, c - 1} + 1) + \frac{n - a - b - c}{n}f_{a, b, c} + \frac{n - a - b - c}{n}

fa,b,cnabcnfa,b,c=an(fa1,b+1,c+1)+bn(fa,b1,c+1+1)+cn(fa,b,c1+1)+nabcnf_{a, b, c} - \frac{n - a - b - c}{n}f_{a, b, c} = \frac{a}{n}(f_{a - 1, b + 1, c} + 1) + \frac{b}{n}(f_{a, b - 1, c + 1} + 1) + \frac{c}{n}(f_{a, b, c - 1} + 1) + \frac{n - a - b - c}{n}

a+b+cnfa,b,c=an(fa1,b+1,c+1)+bn(fa,b1,c+1+1)+cn(fa,b,c1+1)+nabcn\frac{a + b + c}{n}f_{a, b, c} = \frac{a}{n}(f_{a - 1, b + 1, c} + 1) + \frac{b}{n}(f_{a, b - 1, c + 1} + 1) + \frac{c}{n}(f_{a, b, c - 1} + 1) + \frac{n - a - b - c}{n}

fa,b,c=na+b+c(an(fa1,b+1,c+1)+bn(fa,b1,c+1+1)+cn(fa,b,c1+1)+nabcn)f_{a, b, c} = \frac{n}{a + b + c}\left(\frac{a}{n}(f_{a - 1, b + 1, c} + 1) + \frac{b}{n}(f_{a, b - 1, c + 1} + 1) + \frac{c}{n}(f_{a, b, c - 1} + 1) + \frac{n - a - b - c}{n}\right)

fa,b,c=aa+b+c(fa1,b+1,c+1)+ba+b+c(fa,b1,c+1+1)+ca+b+c(fa,b,c1+1)+nabca+b+cf_{a, b, c} = \frac{a}{a + b + c}(f_{a - 1, b + 1, c} + 1) + \frac{b}{a + b + c}(f_{a, b - 1, c + 1} + 1) + \frac{c}{a + b + c}(f_{a, b, c - 1} + 1) + \frac{n - a - b - c}{a + b + c}

这样就可以直接 DP 了,时间复杂度为 O(n3)O(n^3)

  • K 博弈论 DP。设 fi,0/1f_{i, 0 / 1} 为堆里还剩 ii 块石头,Taro / Jiro 先操作,Taro 的输赢情况。(11 表示赢)由于 Taro 想让自己尽可能地赢,所以 fi,0=j=1nfiaj,1f_{i, 0} = \bigvee_{j = 1}^n f_{i - a_j, 1}。Jiro 想让 Taro 尽可能输(也就是让自己尽可能赢),所以 fi,1=j=1nfiaj,0f_{i, 1} = \bigwedge_{j = 1}^n f_{i - a_j, 0}。特别的,如果对于每一个 jjiaji - a_j 都小于 00,那么要让另外一个选手赢。

  • L 博弈论,区间 DP。设 fl,rf_{l, r} 为取到只剩区间 [l,r][l, r] 的元素,Taro 先手能获得的最大得分差,gl,rg_{l, r} 为取到只剩区间 [l,r][l, r] 的元素,Jiro 先手能获得的最小得分差。枚举当前取走 ll 还是 rr,随便转移一下即可。

  • M 前缀和优化 DP。设 fi,jf_{i, j} 为前 ii 个孩子分了 jj 块糖果的方案数,转移为 fi,j=k=jaijfi1,kf_{i, j} = \sum_{k = j - a_i}^j f_{i - 1, k},时间复杂度为 O(nk2)O(nk^2),会超时。再设 sumi,j=k=0jfi,ksum_{i, j} = \sum_{k = 0}^j f_{i, k},就可以做到 O(nk)O(nk) 了。

  • N 原题 P1775,不讲。

  • O 状压 DP。设 fi,jf_{i, j} 为目前给前 ii 个男人配对,且女人的配对情况为 jj 时方案数。枚举第 ii 个男人与哪个女人配对,转移为 fi,j=k=1n[j&2k1]×ai,k×fi,j2k1f_{i, j} = \sum_{k = 1}^n [j \& 2^{k - 1}] \times a_{i, k} \times f_{i, j \oplus 2^{k - 1}}。时间复杂度为 O(n2×2n)O(n^2 \times 2^n),会超时。

    我们考虑去除无用状态。由于题目要求的是 nn 个男人和 nn 个女人配对的方案数,而且每个男人只能配对一个女人,所以 i=popcnt(j)i \not= \operatorname{popcnt}(j)fi,jf_{i, j} 都是无用状态。时间复杂度降至 O(n×2n)O(n \times 2^n),可以通过。

  • P 类似于没有上司的舞会,设 fu,0/1f_{u, 0 / 1}uu 点选 / 不选的方案数,转移为 fu,0=vson(u)fv,0+fv,1f_{u, 0} = \prod_{v \in \operatorname{son}(u)} f_{v, 0} + f_{v, 1}fu,1=vson(u)fv,0f_{u, 1} = \prod_{v \in \operatorname{son}(u)} f_{v, 0}(子树之间不会互相影响,满足乘法原理)。

  • Q 树状数组优化 DP(当然用线段树也可以)。设 fif_i 为 LIS 最后一个元素为 aia_i 的最大价值,可以列出转移 fi=maxj=1i1{[ai>aj]fj}+bif_i = \max_{j = 1}^{i - 1}\{[a_i > a_j]f_j\} + b_i。转移的限制有两个,第一个是下标的限制,第二个是 aia_i 的限制。第一个限制只需要在每次转移后,将 fif_i 插入即可。而第二个限制可以在 aia_i 的位置插入 fif_i,转移时用树状数组查询 [1,ai1][1, a_i - 1] 的前缀最大值即可。

  • R 矩阵快速幂优化递推。设 fi,jf_{i, j} 为长度为 ii,终点为 jj 的路径数。有转移方程 fi,j=k=1nek,j×fi1,kf_{i, j} = \sum_{k = 1}^n e_{k, j} \times f_{i - 1, k},时间复杂度为 O(n2K)O(n^2K)

    我们发现这个柿子有点像矩阵乘法的形式,于是我们可以写出初始矩阵 BB[1111]\begin{bmatrix}1 & 1 & 1 & \cdots & 1\end{bmatrix}nn11)。然后,我们发现转移矩阵就是题目中给出的邻接矩阵 EE。目标矩阵为 B×EKB \times E^K,答案为目标矩阵的第一行之和。

  • S 数位 DP。设 llnn 的位数,sis_inn 的第 (l1)(l - 1) 位到第 ii 位之和,fi,j,kf_{i, j, k} 为目前填到第 ii 位,位数和 modd\mod d 的结果,sumi,j=k=09fi,j,ksum_{i, j} = \sum_{k = 0}^9 f_{i, j, k}。转移有 fi,j,k=sumi1,((jk)modd+d)moddf_{i, j, k} = sum_{i - 1, ((j - k) \bmod d + d) \bmod d}

    答案可以分成两类统计:位数小于 ll 的,和位数等于 ll 的。

    第一类为 i=0l2sumi,0fi,0,0\sum_{i = 0}^{l - 2} sum_{i, 0} - f_{i, 0, 0}(前导 00 的情况不能算)。

    第二类为 (i=0l1k=[i=l1]n10imod101fi,x,k)+[s0=0]\left(\sum_{i = 0}^{l - 1}\sum_{k = [i = l - 1]}^{\frac{n}{10^i} \bmod 10 - 1} f_{i, x, k}\right) + [s_0 = 0]。其中 x[0,d]x \in [0, d]x+si+10(modd)x + s_{i + 1} \equiv 0 \pmod d。意思已经很明显了,第 l1l - 1 位到第 i+1i + 1 位都与 nn 相等,数位和已经确定,现在要求的填法使得第 ii 位小于 nn,并且数位和与已经确定的部分之和模 dd00,至于 [s0=0][s_0 = 0] 就是看 nn 是否符合要求。

    这样统计答案可以做到不重不漏。

  • T 前缀和优化 DP。设 fi,jf_{i, j} 为前 ii 个位置填了互不相同的 ii 个数,其中最后一个数在其中的排名jj。可以列出状态转移方程 fi,j={k=1j1fi1,kopi1="<"k=jifi1,kopi1=">"f_{i, j} = \begin{cases}\sum_{k = 1}^{j - 1} f_{i - 1, k} & op_{i - 1} = \texttt{"<"} \\ \sum_{k = j}^i f_{i - 1, k} & op_{i - 1} = \texttt{">"}\end{cases}。使用前缀和优化即可。

  • U 状压 + 枚举子集。首先 O(n22n)O(n^22^n) 预处理出 score(s)\operatorname{score}(s) 为将 ss 内的兔子分到一组的得分。然后设 fif_i 为兔子选择状态为 ii 时的最大得分。(选择的兔子分成了若干组)转移为 fi=maxji{fij+score(s)}f_i = \max_{j \in i}\{f_{i - j} + \operatorname{score}(s)\}。总时间复杂度为 O(n22n+3n)O(n^22^n + 3^n)

  • V 换根 DP。设 fuf_uuu 节点染色,以 uu 为根的子树的方案数,gug_uuu 节点涂色,以 uu 为根的剩余部分方案数,那么 uu 节点的答案就是 fu×guf_u \times g_u。有转移 fu=vson(u)fv+1f_u = \prod_{v \in \operatorname{son}(u)} f_v + 1

    接下来我们考虑一次换根求出 gg。首先,g1=1g_1 = 1。然后,gv=(gu×pson(p)&p=vfp)+1g_v = \left(g_u \times \prod_{p \in \operatorname{son}(p) \& p \not=v} f_p\right) + 1。如果我们暴力枚举 pp,时间复杂度会被菊花图卡成 O(n2)O(n^2)。我们可以预处理出 fvf_v 的前缀积和后缀积,就可以 O(1)O(1) 算出 \prod 部分了。

  • W 线段树优化 DP。设 fjf_j 为最后一个 11jj 位置的最大得分。由于贡献不太好算,所以我们考虑在每一个区间的右端点处加上这个区间的贡献。得出转移 fi=maxj=0i1{fj}f_{i} = \max_{j = 0}^{i - 1}\{f_j\}fjfj+rk=i&lkjakf_j \to f_j + \sum_{r_k = i \& l_k \le j} a_k 第一个转移是个区间最值问题,第二个转移是个区间加,用线段树维护即可。

  • X 排序确定 DP 顺序。可以用邻项交换法证明,以 si+wis_i + w_i 小的块应该放在 si+wis_i + w_i 大的块上面。排序后,设 fi,jf_{i, j} 为用前 ii 个方块建出的塔重量为 jj 时塔的最大价值,有转移 fi,j=max(fi1,j,fi1,jwi+vi) (wijsi+wi)f_{i, j} = \max(f_{i - 1, j}, f_{i - 1, j - w_i} + v_i) \ (w_i \le j \le s_i + w_i)

  • Y 因为白格子数量巨大,而黑格子最多只有 3×1033 \times 10^3 个,应该思考按照黑格子计数的方式。

    首先将黑格子按照 xxyy 排序,然后设 fif_i 为从 (1,1)(1, 1) 走到第 ii 个黑格子,且中途不经过其他黑格子的方案数。从 (1,1)(1, 1) 走到 (x,y)(x, y) 的方案数显然是 Cx+y2x1C_{x + y - 2}^{x - 1}(或 Cx+y2y1C_{x + y - 2}^{y - 1}),我们可以用它减去至少经过一个黑格子的方案,就得到了 fif_i。显然可以枚举经过的第一个黑格子,由于经过的第一个黑格子不同,这两条路线就不同,所以可以做到计数不重复。

  • Z 听说是斜率优化,我不会(