7.16 动态规划

线性DP

[USACO20DEC] Sleeping Cows P

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

对于牛棚:

fi,jfi+1,j

jfi,jfi+1,j1

对于奶牛:

fi,jfi+1,j+1

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

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

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

新状态:

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

对于牛棚:

1.fi,j,1fi+1,j,1废弃这个牛棚

2.jfi,j,1fi+1,j1,1拿这个牛棚去匹配队列的一头待匹配的牛

3.jfi,j,0fi+1,j1,0同上

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

1.fi,j,1fi+1,j+1,1

2.fi,j,1fi+1,j,0

3.fi,j,0fi+1,j+1,0

4.fi,j,0fi+1,j,0

时间复杂度:O(n2)

「KDOI-03」构造数组

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

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

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

fi+1,j+ufi,jCluCkbiu

时间复杂度:O((bi)2)

Rotating Substrings

一次操作实际上是将Sr拿出来放到Sl1Sl之间。

设计状态:

fi,j表示考虑S后缀i-n,T后缀j-n,最少拿元素使后缀匹配

1.fi,jfi+1,j+1(si=tj) 匹配了,继续下一位

2.fi,jfi+1,j+1si扔到前面去

3.fi,jfi,j+1thenumberoftjinTthenumberoftjinS T去接收一个S之前被挪到前面的字符

Array Beauty

排序,设fi表示美观度i的方案数

答案即为fi

枚举一个 x,设计dpi,j指前i个,ai必选,序列长度为 j 且美观度x的方案数

可以转移过来的ak要满足条件aiakx,有dpi,jdpk,j1,不难发现满足条件的ak为一个区间

前缀和优化即可

「USACO 2021.12 Platinum」Paired Up

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

dpi,j为匹配了i头h牛和j头g牛时的最大权值

三种情况:

  1. i不匹配:dpi,jdpi,j1

  2. j不匹配:dpi,jdpi1,j

  3. i与j匹配:dpi,jdpi1,j1+vali+valj|xixjk|

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

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

显然我们将x1y1x2y2匹配更优

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

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

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

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

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

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

dpi,j,0dpi+1+l,j+l,0

dpi,j,0dpi+l,j+l+1,1|xj+l+1xi>k|

dpi,j,1转移同理

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

更好实现且差不多的写法

时间复杂度:O(n2)

树形dp

Maximizing Root

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

Tree Elimination

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

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

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

Swap and Maximum Block

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

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

[SDOI/SXOI2022] 小 N 的独立集

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

fu,p,q 为选u时答案为p,不选u是答案为q的方案数

考虑从fv,p,q 转移

fv,p,qfu,p+q,max(q+p,q+q)

复杂度分析:O(sizu2sizv2k4)O(n4k4)

发现p,q大小差不会超过kpq+k

更换状态含义fu,p,q,p=max(p,q)

此时qpq+k

fu,max(pu+qv,qu+pv),qu+pvfu,pu,qu+fv,pv,qv

状压dp

Graph Problem With Small n

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

2n24

直接状压dp,O(2nn3)

bitset优化,O(2nn2)

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

时间复杂度O(2nn)

[THUPC2021 初赛] 密集子图

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

fd,s1,s2指深度为 d 的点的集合为 s1 ,深度小于等于 d 的点的集合为 s2,显然s1s2,枚举s1,s2,s3转移;

fd,s1,s2fd+1,s1|s3,s3Ps1s3Ps1s2s3

预处理后两种P

时间复杂度:O(n4n)

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

代码

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

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

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

考虑刚才的贪心,设计fs,bi,blast,last(把想知道的都记下来

时间复杂度O(2nn2m2)

状态太多,考虑动刀blast

blast不停递增,考虑只去记增量,或者说是代价提前计算,因为它不停递增的性质,如果当前bi+1,那么后面所有bi+1n都要+1,先把这群贡献算进bi

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

最后对 𝑥𝑚 的 dp 值求和即可

时间复杂度:O(2nn2m)

区间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这样的区间。

设计fl,r表示把区间[l,r]涂成最终状态的方案数

LxRx为颜色x出现的最靠左/右的位置

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

枚举最小的颜色涂的区间为[l,r],显然l<=Lmincol,r>=Rmincol,l,Lmincol,Rmincol,r一共把区间划分成了5段

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

[USACO23FEB] Piling Papers G

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

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

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

时间复杂度:O(n2log2B)

dp优化

[CEOI2019] 立方填词

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

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

考虑去预处理fx,y,z为附近3个点字符为x,y,z时的贡献

具体的,我们定义glen,x,y为长度为len,开始字符为x,结束字符为y时的方案数

fx,y,z=k0,127glen,x,kglen,y,kglen,z,k

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

时间复杂度:O(4)

Tenzing and Triangle

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

扫描线+线段树即可

「COCI 2021.11」磁铁

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

ri排序,我们就只用考虑后面的磁铁对前面的影响

状态fi,c,l表示考虑到第i个,连续段个数为c,连续段总长度为l时的方案数

最后再考虑空位插入乘上Cll+nn

时间复杂度:O(n2l)

The Knapsack problem

超大杯完全背包

将m分为较均匀的两团,可以证明两团之间大小不会超过Wmax

递归到mw2时暴力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 @   Linnyx  阅读(81)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示