[做题笔记 #1] DP
- [做题笔记 #1] DP
- P2339 [USACO04OPEN] Turning in Homework G
- CF2025D Attribute Checks
- P8981 「DROI」Round 1 距离
- P3643 [APIO2016] 划艇
- P4463 [集训队互测 2012] calc
- P9823 [ICPC2020 Shanghai R] The Journey of Geor Autumn
- AT_arc178_d [ARC178D] Delete Range Mex
- AT_arc093_d [ARC093F] Dark Horse
- P3262 [JLOI2015] 战争调度
- CF1153F Serval and Bonus Problem
- P4042 [AHOI2014/JSOI2014] 骑士游戏
- AT_arc073_d [ARC073F] Many Moves
- AT_abc221_g [ABC221G] Jumping sequence
[做题笔记 #1] DP
[ ] 里的是我还不确定的。
P2339 [USACO04OPEN] Turning in Homework G
正难则反。考虑倒序处理……
2024.[10](?).?
CF2025D Attribute Checks
状态先设阶段,用好不对称状态。
不要忘了最后一段的贡献。
2024.10.28
P8981 「DROI」Round 1 距离
换根 DP(二次扫描法)。
注意统计最大值和最大值的出现次数。有两种写法:边求最大值边统计、求出最大值后看最大值是谁来统计(都是 DP)。
如何统计树上经过一个点的路径:
- 路径两端点不同。我们把这个点去掉,树被分成很多块,把这个点也作为一个块,那么两端点一定在不同的两个块内。实际实现时可以分为 子结点的子树(可以有很多块)、这个点自己、它上面的部分 这三部分来处理。
- 路径两端点相同。那么两个端点一定都是这个点,直接统计即可。
细节较多。代码写成了史山。
2024.10.29 和 xjy duel 的题。2024.10.30 才改出来并写了总结。
P3643 [APIO2016] 划艇
分段拉插优化 DP。
2024.11.1
P4463 [集训队互测 2012] calc
2024.11.1
P9823 [ICPC2020 Shanghai R] The Journey of Geor Autumn
[P9823 ICPC2020 Shanghai R] The Journey of Geor Autumn - 洛谷 | 计算机科学教育新生态
回家后补上。
AT_arc178_d [ARC178D] Delete Range Mex
赛时想法:排列,
明确一个事情:题目给出的序列
于是我们直接考虑删的过程。删除每个数需要
- 因为删除大的需要小的存在,所以从大到小删除。
- 因为
且 它的点要形成一段不包含它自己的区间,所以小于它的点要么都在它的左侧,要么都在它的右侧。
不妨从小到大加入数,加入的数分两种:要删的和不要删的。
对于要删的数,要满足小于它的数都在它的一侧。我们考虑已经填的数是怎么限制它的,已经填的数形成了一段区间,这个数只能填在区间之外。于是把这个区间放进状态里,进行区间 DP。
对于不删的数,它要被放回它原来的位置。
显然每个要删的数是卡到不删的数的缝里的,且每个缝里可以塞不止一个数。如果动态地表示缝(把不删的数也拿去形成缝)不是很好处理,于是我们就直接用原序列的缝的位置作为区间的端点。
写 DP 转移方程,发现要前缀和优化。
2024.11.23
2024.11.27
AT_arc093_d [ARC093F] Dark Horse
对于方案数相同的情况,我们只处理一种——因为是满二叉树,所以
发现剩下了若干棵大小为
其实不是子树,就是划分集合,每个集合里再排列一下。
发现集合的数量非常少,我们得以状压。为了不记录集合的大小,我们要填就一下填完一整个集合。
[最小值不在
为了一填就填满一整个集合,我们从大到小枚举集合中的数,每次要填就填枚举到的那个数和大于它的还剩下的数,方案数是容易用 [[[排列数]]] 表示的。值得一提的是状压的状态刚好也表示填了的数的个数,于是不用在状态里额外记填了多少个数(其实也就是说记填了哪些集合,因为每个集合的大小是确定的,所以填的数的个数也就知道了,只是这里可以方便地直接用)。
注:这道题的这篇题解是我在做完这道题的几天后写的,可能有些忘了,写的时候也没看之前的代码,如果有错误请指出,抱歉。
2024.11.27
P3262 [JLOI2015] 战争调度
层数小想到状压,但一个一个叶子结点的处理太慢了,考虑到满二叉树的优美性质,我们还是考虑树形 DP。
做法看起来像是神秘暴力 + 树形背包。但实际上是状压 + 树形背包 来设状态。
设
具体写的时候没有在 DP 数组里记
对于一个以它为根的子树大小为
我们不妨拿
那么每个结点的状态数就是
另外要注意时间复杂度不直接是状态数,而要考虑转移的复杂度。
对于一个以它为根的子树大小为
不会分析了。QwQ
2024.11.27
CF1153F Serval and Bonus Problem
显然可以把
被覆盖长度期望 可以被转化为 任意点被覆盖的概率。
此题中,这样转化之后,再把概率转化为方案数。
在长度为
这
不妨设想是括号匹配,那么这个点就要在至少
可以 DP 了。状态:
转移有三种:这个点是那个被覆盖的点(选这个点要求前面没匹配的点有
因为我们要用方案数来算概率,而排列的总方案数是
参考(从那里学的):CF1153F - Serval and Bonus Problem(概率dp) - limil - 博客园 (cnblogs.com)。
2024.11.27
P4042 [AHOI2014/JSOI2014] 骑士游戏
[不清楚 DP 顺序,无脑做就有环。
于是类似 Dijkstra 最短路,贪心确定 DP 顺序,用堆来维护。]
2024.11.27
AT_arc073_d [ARC073F] Many Moves
先设一个暴力的 DP 状态,
去除状态中多余(已表示)的信息:发现一定有一个棋子在
转移有两种:移动哪个棋子。
写转移,发现可以用 [整体 DP 优化],[用线段树优化即可]。
2024.11.27
AT_abc221_g [ABC221G] Jumping sequence
[曼哈顿距离转切比雪夫距离,从而把两维拆开(发现每一步某一维上的选择对另一维的并没有影响(没有限制))。]
[稍微推一下式子,] 跑 01 可行性背包,于是可以用 bitset 优化。[(不知道能不能不推式子,平移使得下标全部非负,直接跑 01 可行性背包。)]
[倒序求出背包的一种方案。]
好像特判细节不少。
2024.11.27
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!