集训游记 7.15-7.17 基础算法/动态规划
Day1
LOJ#6490. 「XXOI 2018」暑假时在做什么?有没有空?可以来学物理吗?
考虑 CDQ 分治.设当前分治区间为
先更新
Buy Low Sell High
反悔贪心.对于某一天
P5290 [十二省联考 2019] 春节十二响
7.15Test T4
考虑构造
具体地,考虑插入一个数.跟异或线性基相同的,从高位开始枚举,若碰到不存在数字,并且自己哪一位非
Day2
主要讲的是 DP.然后题补的不多.简单地记一下.
然后相对来说比较简单的题目就记一下大体思路.难题还是尽量给出实现.
做题记录以例题为主,之后会去补作业.
序列 DP
序列 DP 的题目.由于序列的拓扑结构相对简单,所以题目本身往往相对诡异.写题时容易无法下手.需要斟酌状态设计、转移顺序和优化方式.有时可以思考重排序列使得有贡献的转移集中在某一区间.
P7154 [USACO20DEC] Sleeping Cows P
由于保证了奶牛和牛棚大小互不相同,我们可以考虑把奶牛和牛棚放在一起排序:每个元素只能和前面的元素匹配,这个性质是有利于设计 DP 状态的.
先不考虑极大匹配的限制.记
再来考虑极大匹配的限制.那么每个奶牛就有两种选择:
- 选择匹配,需要等待后面的某一个牛棚.
- 选择不匹配,不允许后面有闲置的牛棚.
虽然一个奶牛选择是否匹配影响了后面的牛棚的抉择状态.但我们不妨在遍历到奶牛的时候就 提前决定 其是否选择匹配.为防止后效性,肯定是需要重新设计 DP 数组的.
记
有转移方程:
P8863 「KDOI-03」构造数组
操作次数显然是固定的
那么我们将每个操作时的数组看成一列,会形成一个大小为
设计 DP 状态,记
转移枚举当前行有多少个
有转移方程:
其中
CF1363F Rotating Substrings
非常神仙的线性 DP.循环位移一位很丑,我们可以想成:把某一位的字符扔到序列的前面某一位去.就有一种特别神奇的,从后往前 DP 的方法.
记
这里 “挂起” 的意思是将某字符拎起来,但还不决定把它扔到哪.
对
匹配,有
挂起,让后面的 匹配,有
去匹配后面的 ,把后面 中挂起的等于 的字符扔到这里来和 匹配.
这时要有
CF1188C Array Beauty
将
发现
这是我们已经可以做了.但其实它有更美观的形式.设
P7985 [USACO21DEC] Paired Up P
存在性质:交叉匹配一定不更优于不交叉的匹配.因为这样可以减小两对匹配的距离绝对值.或者这样说:若存在若干对匹配相交,肯定有一种合法的调整方案使得它们不相交.
考虑
再考虑
记
尝试理解一下这个抽象的状态:就是说下一头 荷斯坦牛/更赛牛 和前面的所有 更赛牛/荷斯坦牛 全部无法匹配.转移时分类讨论:
- 保留待贡献的牛的种类.
- 尝试改变待贡献的牛的种类.
每次找出某一头 荷斯坦奶牛/更赛牛 位置之后的,第一头不能与它匹配的 更赛牛/荷斯坦牛 的 前一个位置,并尝试转移到它那里来.
树形 DP
有点遗憾没讲到换根 DP,反倒是图论讲缩点的时候谈了一下.
CF1778F Maximizing Root
首先有结论,自底而上操作的顺序肯定更优.这符合我们自底而上的 DP 顺序.
最大化
具体地,我们设
对于不操作
考虑缩小状态数,发现使
P8352 [SDOI/SXOI2022] 小 N 的独立集
相当于在树上最大独立集的外壳假象下的计数.容易想到状态
这时有技巧 DP 套 DP!就是说状态合并时,转移的新状态需要由原来状态通过某些决策 DP 出来.考察
非常优美非常和谐!状态数爆炸!
继续寻找性质:发现勒令不选的答案不会比勒令选的答案小很多.事实上,勒令选的答案去掉
再来简要分析一下树上背包的时间复杂度:
for(int v:e[u]){
dfs(v, u);
for(int i=1; i<=sz[u]; i++){
for(int j=1; j<=sz[v]; j++){
...
}
}
sz[u]+=sz[v];
}
考虑一份这样的树上背包,其实在实现一个这样的过程:
枚举子树
而对于此题,由于还要枚举额外的增量数组.综时间复杂度为
Swap and Maximum Block
根据序列建出 trie 树.
发现交换每两个相邻的
对于
状态压缩 DP
有一道 Codeforce 训练场的题,但主要是乱用 bitset 瞎搞.有时间去补一下.
P7142 [THUPC2021 初赛] 密集子图
主要难在刻画最短路.我们把原图最短路小于等于
记
存在转移
然后我们预处理
P7519 [省选联考 2021 A/B 卷] 滚榜
又是一道代价提前计算的好题!
发现让我计算可能排列的个数:一种排列只能算作一次.
考虑状压队伍的集合,然后按揭榜的顺序 DP 是较容易的.由于
但同时不能漏掉可能的排列:要保证任意一种可能合法点排列在我们的映射方案上都是合法的!
贪心.顺序考虑揭榜的每一个队伍,在保证其能达到当前榜首的前提下,确保其
区间 DP
P4563 [JXOI2018] 守卫
突破口非常奇怪.但又很合理.
考虑一个性质:守卫只能向左边看.那么对于一个区间
那么这个区间就被我们划分成了两部分:
还有一个细节.那就是当
CF1178F2 Long Colorful Strip
这个区间 DP 思路还比较自然.
首先想到可以离散化.一次划分顶多产生两个颜色不同的分解点.如果离散化之后的数组长度
考虑设计 DP 状态.设
转移时可以确定最小颜色围出的区间肯定要覆盖最小颜色.然后我们枚举覆盖的区间向左右延伸多少即可.这样会存在许多非法的状态.设最小颜色围出的区间是
P9129 [USACO23FEB] Piling Papers G
另辟蹊径的数位 DP.
首先答案是可差分的.那么求坐落于
像常规方式一样记录
同样是 提前计算/提前确定 的思想,我们设
其它 DP 题目
P7967 [COCI2021-2022#2] Magneti
抱き寄せて欲しい 確かめて欲しい
想要被拥入你怀中 想要确认心意
間違いなど無いんだと 思わせて
让我知道 没有误会了什麼
首先按
设计状态就需要一些奇思妙想.设
然后考虑添加一块磁石可能的三种变化:
- 独立为一个联通块:
- 和其中的某一联通块合并:
- 和其中两个联通块串起来:
那么最后答案肯定是
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!