7.16 动态规划

线性DP

[USACO20DEC] Sleeping Cows P

先不考虑极大,将奶牛和牛棚放在一起排序并离散化,设 \(f_{i,j}\) 为处理到第 i 个元素(奶牛/牛棚) ,有 j 头奶牛还没有进入牛棚的方案数。

对于牛棚:

\[f_{i,j}\rightarrow f_{i+1,j} \]

\[j*f_{i,j}\rightarrow f_{i+1,j-1} \]

对于奶牛:

\[f_{i,j}\rightarrow f_{i+1,j+1} \]

考虑极大,一头奶牛可能之后会被匹配,所以我们在加入一头奶牛时就考虑它最终会不会被匹配。

注意到如果废弃了一头奶牛,那么在它之前的牛棚可以被废弃,而在它之后的牛棚不能被废弃。

如果我们去记录一头奶牛被废弃的时间,时间复杂度爆炸,但是我们发现以第一头被废弃的奶牛为分界点,后面的牛棚不能废弃,而之前的可以,所以我们只用关心当前有没有被废弃的奶牛就可以了。

新状态:

\(f_{i,j,0/1}\) 表示当前考虑了大小 \(\le i\) 的奶牛和牛棚,且有j头奶牛还未分配牛棚,目前是否钦定过不被匹配的奶牛,其中 1 表示目前没有被废弃的奶牛。

对于牛棚:

1.\(f_{i,j,1}\rightarrow f_{i+1,j,1}\quad\)废弃这个牛棚

2.\(j*f_{i,j,1}\rightarrow f_{i+1,j-1,1}\quad\)拿这个牛棚去匹配队列的一头待匹配的牛

3.\(j*f_{i,j,0}\rightarrow f_{i+1,j-1,0}\quad\)同上

对于奶牛,讨论废不废弃即可。

1.\(f_{i,j,1}\rightarrow f_{i+1,j+1,1}\)

2.\(f_{i,j,1}\rightarrow f_{i+1,j,0}\)

3.\(f_{i,j,0}\rightarrow f_{i+1,j+1,0}\)

4.\(f_{i,j,0}\rightarrow f_{i+1,j,0}\)

时间复杂度:\(O(n^2)\)

「KDOI-03」构造数组

我们已经知道总操作步数m

问题等价于,在一个 \(𝑛×𝑚\) 的棋盘上,放若干棋子,且每行恰有 \(𝑏_𝑖\) 个棋子,每列恰有 2 个棋子

按行考虑,记 \(𝑓_{i,j}\) 表示考虑了前 𝑖 行,且有 𝑗 列有 2 个棋子。根据前 𝑖 行的棋子总数可以算出 0 个棋子的列数 𝑘 和 1 个棋子的列数 𝑙。

\[f_{i+1,j+u}\leftarrow f_{i,j}*C_l^u*C_k^{b_i-u} \]

时间复杂度:\(O((\sum b_i)^2)\)

Rotating Substrings

一次操作实际上是将\(S_r\)拿出来放到\(S_{l-1}\)\(S_l\)之间。

设计状态:

\(f_{i,j}\)表示考虑S后缀i-n,T后缀j-n,最少拿元素使后缀匹配

\(1. f_{i,j}\leftarrow f_{i+1,j+1}\quad(s_i=t_j)\quad\) 匹配了,继续下一位

\(2.f_{i,j}\leftarrow f_{i+1,j}+1\quad\)\(s_i\)扔到前面去

\(3.f_{i,j}\leftarrow f_{i,j+1} \; the\;number\;of\;t_j\;in\;T \le the\;number\; of\;t_j\;in\;S\quad\) T去接收一个S之前被挪到前面的字符

Array Beauty

排序,设\(f_{i}\)表示美观度\(\ge i\)的方案数

答案即为\(\sum f_i\)

枚举一个 \(x\),设计\(dp_{i,j}\)指前i个,\(a_i\)必选,序列长度为 \(j\) 且美观度\(\ge x\)的方案数

可以转移过来的\(a_k\)要满足条件\(a_i-a_k\ge x\),有\(dp_{i,j}\leftarrow dp_{k,j-1}\),不难发现满足条件的\(a_k\)为一个区间

前缀和优化即可

「USACO 2021.12 Platinum」Paired Up

先考虑T=1即要求最大化匹配权值时我们怎么做

\(dp_{i,j}\)为匹配了i头h牛和j头g牛时的最大权值

三种情况:

  1. i不匹配:\(dp_{i,j}\leftarrow dp_{i,j-1}\)

  2. j不匹配:\(dp_{i,j}\leftarrow dp_{i-1,j}\)

  3. i与j匹配:\(dp_{i,j}\leftarrow dp_{i-1,j-1}+val_i+val_j\quad\lvert x_i-x_j\le k\rvert\)

为什么我们在这里不考虑题目所给的极大匹配,因为这里的最优方案只会从极大匹配中产生,如果有没有匹配的,那将他们匹配上显然更优

对于T=2的情况,通过观察,我们可以发现,匹配是不交的,什么叫不交的,即对于\(x_1\)\(y_2\)\(x_2\)\(y_1\)匹配的情况(x,y递增)

显然我们将\(x_1 y_1\; x_2 y_2\)匹配更优

有了这个性质,我们考虑如果要失配的相邻两头牛要满足什么条件:

1.如果相邻是h牛和g牛,那么他们的距离要大于k

2.如果相邻的是同种牛,那么无事发生

状态自然就出来了,仿照T=1时的状态\(dp_{i,j,0/1}\)最后一维表示最后没匹配的是h牛还是g牛

转移的时候我们去枚举失配牛的位置:

具体的,枚举l为经过的匹配牛的对数

\[dp_{i,j,0}\rightarrow dp_{i+1+l,j+l,0} \]

\[dp_{i,j,0}\rightarrow dp_{i+l,j+l+1,1}\; \lvert x_{j+l+1}-x_{i}> k\rvert \]

\(dp_{i,j,1}\)转移同理

但是时间复杂度仍然是\(O(n^3)\)不能接受,但是发现对于\(dp_{i,j}\)合法的l是一个区间,分别维护两个二维前缀max(口胡),并且维护2个双指针,转移变成\(O(1)\)

更好实现且差不多的写法

时间复杂度:\(O(n^2)\)

树形dp

Maximizing Root

最终对答案有贡献的因数,都是\(a_1\)的因数,我们就只需要知道对于每个树上的节点,它以及它的子树有\(a_1\)某因子的最小操作步数,一次操作,会让\(i\rightarrow i^2\),在做的时候判一下可不可以得到\(a_1\)某个因子即可

Tree Elimination

通过序列可以还原出擦边顺序,记\(f_{u,0/1/2/3}\)表示点u没擦除标记/擦除边在父边之前/擦除边为父边/擦除边在父边之后

按(u,v)的出边编号从小到大转移,形式有3种,分别为u擦除前/擦除时/擦除后

巨大分讨,先囤着晚些时候再写

Swap and Maximum Block

将编号-1,插入01trie,发现每次交换其实是对所有深度n-k的点左右儿子翻转。

\(f_{u,s,0/1/2/3}\) 为u点,且u字树内每层是否反转左右儿子时,四个信息(线段树维护最大子段和)是什么

[SDOI/SXOI2022] 小 N 的独立集

没有上司的舞会(最大权独立集问题)加强版

\(f_{u,p,q}\) 为选u时答案为p,不选u是答案为q的方案数

考虑从$ f_{v,p',q'}$ 转移

$ f_{v,p',q'}\rightarrow f_{u,p+q',max(q+p',q+q')}$

复杂度分析:\(O(\sum siz_u^2*siz_v^2*k^4)\rightarrow O(n^4k^4)\)

发现\(p,q\)大小差不会超过\(k\)\(p\le q+k\)

更换状态含义\(f_{u,p',q},p'=max(p,q)\)

此时\(q\le p'\le q+k\)

\(f_{u,max(p_u+q_v,q_u+p_v),q_u+p_v}\leftarrow f_{u,p_u,q_u}+f_{v,p_v,q_v}\)

状压dp

Graph Problem With Small n

题意:给定一张n点简单无向图,对所有点对\((i,j)(i\neq j)\)询问是否存在起点为i,终点为j的哈密顿路

\(2\le n \le 24\)

直接状压dp,\(O(2^nn^3)\)

bitset优化,\(O(2^nn^2)\)

将1看作一个中转点,将路径拆成2部分,从1跑一边dp,再用bitset每次处理同一1至起点集合补集的终点

时间复杂度\(O(2^nn)\)

[THUPC2021 初赛] 密集子图

考虑最短路树,对于深度为i的某个点,深度小于 i−1 的点不能向其边,至少有一个深度为i−1 的点向其连边,对于其他点连向它的边没有限制。

\(f_{d,s_1,s_2}\)指深度为 d 的点的集合为 \(s_1\) ,深度小于等于 d 的点的集合为 \(s_2\),显然\(s1\subset s2\),枚举\(s_1,s_2,s_3\)转移;

\[f_{d,s_1,s_2}\leftarrow f_{d+1,s_1|s_3,s_3}*P_{s_1至少有一条边连向s_3}*P_{s_1\oplus s_2 不向 s_3 连边} \]

预处理后两种\(P\)

时间复杂度:\(O(n4^n)\)

挺卡常的(无论是空间还是时间),不能全局longlong,要精细实现

代码

[省选联考 2021 A/B 卷] 滚榜

对于一个固定的排名,我们可以贪心的去分配\(b_i\),检验其可行性

这样暴力(全排列)就有60pts了

考虑刚才的贪心,设计\(f_{s,\sum b_i,b_{last},last}\)(把想知道的都记下来

时间复杂度\(O(2^n n^2 m^2)\)

状态太多,考虑动刀\(b_{last}\)

\(b_{last}\)不停递增,考虑只去记增量,或者说是代价提前计算,因为它不停递增的性质,如果当前\(b_i+1\),那么后面所有\(b_{i+1-n}\)都要+1,先把这群贡献算进\(\sum b_i\)

那么状态变为 \(𝑔_{s,𝑥,𝑦}\) 表示公布了集合 𝑆 中的队伍,目前花了 𝑥 个题数,包括已公布的队伍中花的以及未公布的队伍补的,且最后公布的队伍为 𝑦。

最后对 \(𝑥\le 𝑚\) 的 dp 值求和即可

时间复杂度:\(O(2^nn^2m)\)

区间dp

[JXOI2018] 守卫

对于一个区间\([l,r]\),r 上必须放一个守卫,考虑 r 上守卫能看到的最左边的位置 p,那么容易发现,\([l,p]\)\([p,r]\)中的点互相不可见,区间被分为两块,以此进行区间dp,特别的,当 \(p = l\) 时,找到次能见的点分割区间。

为了维护p,dp枚举顺序为,r从左向右,l从r到1,保证转移q一个区间时其子区间都已经被转移,同时维护p即可

Long Colorful Strip

因为是按1-n的顺序染色,所以如果在某一时刻染了色,以后就不能在使这种颜色扩张,换言之,如果最终状态这种颜色在这个位置,那么它后来就不能被任何一种颜色覆盖。

假设我们在本次染色中染了\(l,r\)这个区间,因为单色的规定,那么我们之后的染色选择,就不能出现\(l'<l<r'<r\)或者\(l<l'<r<r'\)这样的区间。

设计\(f_{l,r}\)表示把区间\([l,r]\)涂成最终状态的方案数

\(L_x R_x\)为颜色x出现的最靠左/右的位置

我们从小区间开始进行区间dp,也就是说,我们先从晚涂色的区间开始,从编号大往小的颜色去枚举其覆盖区间

枚举最小的颜色涂的区间为\([l,r]\),显然\(l<=L_{mincol},r>=R_{mincol}\),\(l,L_{mincol},R_{mincol},r\)一共把区间划分成了5段

转移时分别把这5段方案数用乘法原理乘起来即可

[USACO23FEB] Piling Papers G

将询问差分,\([A,B]\)变为\([1,B]-[1,A-1]\),我们就只需考虑1-x的答案了。

很自然地,我们想去记录目前拼接情况讨论转移,但是,不是很可行,这启发我们去枚举x对应位上的\(a_i\),于是,我们设\(f_{l,r,0/1/2}\)为已经填了对应x的\([l,r]\)位,目前是小于/等于/大于 x。

转移分讨加在左边还是右边或者什么都不做,对每个后缀做一遍。

时间复杂度:\(O(n^2log^2B)\)

dp优化

[CEOI2019] 立方填词

考虑去枚举顶点字符,将每条边单词贡献乘起来,此时复杂度:\(O(\sum^8)\)

理论上,一个点如果知道了附近的3个点的字符,那么自己贡献就是已知的

考虑去预处理\(f_{x,y,z}\)为附近3个点字符为x,y,z时的贡献

具体的,我们定义\(g_{len,x,y}\)为长度为len,开始字符为x,结束字符为y时的方案数

\(f_{x,y,z}=\sum_{k\in{0,127}}g_{len,x,k}*g_{len,y,k}*g_{len,z,k}\)

此时我们就只需要枚举每层不同对角线上的字符一共4个就可以了

时间复杂度:\(O(\sum^4)\)

Tenzing and Triangle

一个星期前刚写过,三角形是不交的

扫描线+线段树即可

「COCI 2021.11」磁铁

假如我们已经确定磁铁相对顺序,考虑两两之间至少间隔隔板法即可算出方案数

\(r_i\)排序,我们就只用考虑后面的磁铁对前面的影响

状态\(f_{i,c,l}\)表示考虑到第i个,连续段个数为c,连续段总长度为l时的方案数

最后再考虑空位插入乘上\(C_{l-l'+n}^n\)

时间复杂度:\(O(n^2l)\)

The Knapsack problem

超大杯完全背包

将m分为较均匀的两团,可以证明两团之间大小不会超过\(W_{max}\)

递归到\(m\le w*2\)时暴力dp

Wonderful Jump

根号分治,待补

练习题

[COCI2016-2017#3] Zoltan

[COCI2015-2016#1] UZASTOPNI loj

[POI2012] SZA-Cloakroom

Card Guessing

Phoenix and Berries

[ARC083E] Bichrome Tree

[SBCOI2020] 一直在你身旁

Colorful Segments

[福建省队集训2019] 最大权独立集问题

posted @ 2023-07-16 12:23  Linnyx  阅读(53)  评论(2编辑  收藏  举报