[做题笔记 #1] DP

[做题笔记 #1] DP

[ ] 里的是我还不确定的。

P2339 [USACO04OPEN] Turning in Homework G

正难则反。考虑倒序处理……

2024.[10](?).?

CF2025D Attribute Checks

状态先设阶段,用好不对称状态。

nm 大小差距大,考虑用 m 个东西把 n 个东西分段,状态按 m 来设。

不要忘了最后一段的贡献。

2024.10.28

P8981 「DROI」Round 1 距离

换根 DP(二次扫描法)

注意统计最大值和最大值的出现次数有两种写法:边求最大值边统计、求出最大值后看最大值是谁来统计(都是 DP)。

如何统计树上经过一个点的路径

  1. 路径两端点不同。我们把这个点去掉,树被分成很多块,把这个点也作为一个块,那么两端点一定在不同的两个块内。实际实现时可以分为 子结点的子树(可以有很多块)、这个点自己、它上面的部分 这三部分来处理。
  2. 路径两端点相同。那么两个端点一定都是这个点,直接统计即可。

细节较多。代码写成了史山。

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

赛时想法:排列,mex:找性质。因为排列(这里是从 0 开始)里的数不重复且是 0,1,2, 这样连续的,所以排列的区间 mex 其实是前缀后缀 min。但这里其实不是很能用上这个结论。

明确一个事情:题目给出的序列 A 一定是我们构造出来的排列的子序列,也就是说排列中的一些点要删,一些点不删。显然不删的点就是 A 中出现的,其他要删。

于是我们直接考虑删的过程。删除每个数需要 0< 它的整数都在一段区间中,且它不在这段区间中。考虑如何满足这个限制,使得所有要删的数都能被删除。

  • 因为删除大的需要小的存在,所以从大到小删除。
  • 因为 0< 它的点要形成一段不包含它自己的区间,所以小于它的点要么都在它的左侧,要么都在它的右侧。

不妨从小到大加入数,加入的数分两种:要删的和不要删的。

对于要删的数,要满足小于它的数都在它的一侧。我们考虑已经填的数是怎么限制它的,已经填的数形成了一段区间,这个数只能填在区间之外。于是把这个区间放进状态里,进行区间 DP。

对于不删的数,它要被放回它原来的位置。

显然每个要删的数是卡到不删的数的缝里的,且每个缝里可以塞不止一个数。如果动态地表示缝(把不删的数也拿去形成缝)不是很好处理,于是我们就直接用原序列的缝的位置作为区间的端点。

写 DP 转移方程,发现要前缀和优化。

2024.11.23

2024.11.27

AT_arc093_d [ARC093F] Dark Horse

对于方案数相同的情况,我们只处理一种——因为是满二叉树,所以 1 的位置在哪里方案数都是一样的;我们直接把 1 固定在第一个叶子结点,算出答案后再 ×2n 得出把 1 放在每个位置上的方案数之和。

发现剩下了若干棵大小为 1,2,4,8,,2n1 的子树,要求这些子树中每一棵的最小值都不在 A 中。

其实不是子树,就是划分集合,每个集合里再排列一下。

发现集合的数量非常少,我们得以状压。为了不记录集合的大小,我们要填就一下填完一整个集合。

[最小值不在 A 中的限制并不是很好满足,于是] 我们考虑容斥。现在需要求出 每种 有些集合最小值必须在 A 中、其他集合随意 的方案数。这个“每种”刚好和状压契合,为了防止对于每一种都重新 DP,我们改状压的状态,某一位上是 1 表示这个集合中的最小值必须在 A 中,只填这些集合。其他的集合是随便填的,所以我们之后把没填的数拿出来求个 [全排列数] 乘上去即可。

为了一填就填满一整个集合,我们从大到小枚举集合中的数,每次要填就填枚举到的那个数和大于它的还剩下的数,方案数是容易用 [[[排列数]]] 表示的。值得一提的是状压的状态刚好也表示填了的数的个数,于是不用在状态里额外记填了多少个数(其实也就是说记填了哪些集合,因为每个集合的大小是确定的,所以填的数的个数也就知道了,只是这里可以方便地直接用)。

注:这道题的这篇题解是我在做完这道题的几天后写的,可能有些忘了,写的时候也没看之前的代码,如果有错误请指出,抱歉。

2024.11.27

P3262 [JLOI2015] 战争调度

层数小想到状压,但一个一个叶子结点的处理太慢了,考虑到满二叉树的优美性质,我们还是考虑树形 DP。

做法看起来像是神秘暴力 + 树形背包。但实际上是状压 + 树形背包 来设状态。

fu,s,i 表示以 u 为根的子树,上面结点(u 的祖先,包括它的父亲)压缩后的状态是 s(每一个二进制位表示这个结点是打仗还是种田),底下有 i叶子 结点打仗的最大贡献度之和。

具体写的时候没有在 DP 数组里记 s,而是在树上直接暴力枚举 s,跑树形背包。

对于一个以它为根的子树大小为 2k1 的点,s 的个数是 2nk(它以及它下面是 k 层,而一共有 n 层,所以上面有 nk 层),i 的个数是 min{2k1,m}2k1 是叶子结点个数)。

我们不妨拿 2k1 来分析,这样分析出来的时间复杂度不会更小。

那么每个结点的状态数就是 2nk×2k1=2n1,总的状态数就是把每个点的状态数加起来,因为每个点的状态数都相同,所以就是每个点的状态数乘结点总数,即 2n1×(2n1)=22n12n1

另外要注意时间复杂度不直接是状态数,而要考虑转移的复杂度。

对于一个以它为根的子树大小为 2k1 的点,它的子结点的叶子结点个数是 2k2,那么这个结点从子结点转移两次,每次的时间是 (2k2)2=22k4

不会分析了。QwQ

2024.11.27

CF1153F Serval and Bonus Problem

显然可以把 l 当成 1 来处理([缩放]),最后再乘 l。现在只处理 l=1 的情况。

被覆盖长度期望 可以被转化为 任意点被覆盖的概率。

此题中,这样转化之后,再把概率转化为方案数。

在长度为 1 的线段上随机撒点形成区间,再随机撒一个点,要求它被覆盖至少 k 次,求方案数。

2n+1 个点(包括那个被覆盖的点)是随机撒的,重复的概率为 0。我们把它们(包括那个被覆盖的点)排序后从左往右依次加入,把 2n 个配对成区间。

不妨设想是括号匹配,那么这个点就要在至少 k 对括号中。

可以 DP 了。状态:fi,j,0/1 表示填了前 i 个点,还有 j 个点(左括号)没匹配,没选 / 选了被覆盖的那个点 的方案数。注意这个被覆盖的点是包含在这 i 个点中的,却不包含在这 j 个点中。

转移有三种:这个点是那个被覆盖的点(选这个点要求前面没匹配的点有 k 个)、这个点和前面匹配、这个点不和前面匹配。

因为我们要用方案数来算概率,而排列的总方案数是 (2n+1)!,最后还要乘 l [放大] 回去,所以最后的答案是 f2n+1,0,1(2n+1)!l

参考(从那里学的):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 状态,fi,j,k 表示当前处理了前 i 个要求,两个棋子分别在 j,k 的最小代价。

去除状态中多余(已表示)的信息:发现一定有一个棋子在 xi,那么我们设 fi,j 表示当前处理了前 i 个要求,一个棋子在 xi,另一个棋子在 j(根据题目,j 可以等于 xi)的最小代价。

转移有两种:移动哪个棋子。

写转移,发现可以用 [整体 DP 优化],[用线段树优化即可]。

2024.11.27

AT_abc221_g [ABC221G] Jumping sequence

[曼哈顿距离转切比雪夫距离,从而把两维拆开(发现每一步某一维上的选择对另一维的并没有影响(没有限制))。]

[稍微推一下式子,] 跑 01 可行性背包,于是可以用 bitset 优化。[(不知道能不能不推式子,平移使得下标全部非负,直接跑 01 可行性背包。)]

[倒序求出背包的一种方案。]

好像特判细节不少。

2024.11.27

posted @   huangkxQwQ  阅读(15)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示