传送门
夏天近了,又到了恋爱的季节,小Q家门前的苹果树上结满了红红圆圆的苹果。
这株苹果树是一个有着个结点的有根树,其中结点被依次编号为至。号结点为根,其余每一个结点的父结点一定是某个编号较小的结点。每一个结点上都有一些苹果,第个结点上有个苹果,每取走其中一个苹果就可以得到的幸福度(若在这个结点取走个苹果,则可以收获的幸福度)。如果在一个结点取走了至少一个苹果,则必须要在其父结点处取走至少一个苹果。
现在,给定正整数,请从树上取走若干苹果。如果总计取走了个苹果,且所有取了至少一个苹果的那些结点的最大深度为(这里规定根结点的深度为),则要求。问最大可以收获多少的幸福度?(这些幸福度全都归属于恋爱中的小Q。)
多组数据,。
选一个包含根的连通块,,最大价值。算法明显是 的。
【简化版】
因为 这个条件过于阴间了,尝试解决简化版 。
【】
即使是简化版,也先考虑解决 的特殊情况。这种情况,每个结点只有选和不选两种情况。
采用 dfn 序 DP。 表示目前考虑完 的结点( 待定),已经选了 个结点,且强制 的祖先们都选了,最大权值是多少。
刷表法转移,考虑 选不选。若 选,转移到 ;若 不选,记 为 子树中 dfn 的最大值,转移到 。
答案取 。状态 ,转移 ,总共 的复杂度。
【 任意】
然后解决简化版的一般情况。状态描述不变,考虑怎么优化转移过程。
先考虑朴素的转移是怎么做的。若选 个,转移到 ;否则 ,要求 。
不选的情况不用动,只需要优化选的情况。
令 。把 视作 ,就是经典的滑动窗口问题,可以 求出 。
然后用 转移 。
还是 的。
【原版】
可以看作是 "允许让一条链上的点免费取一个"。
【】
新建一个 dfn2 序,和上面的 dfn 对儿子的访问顺序完全相反。然后新建一个 按照 dfn2 的顺序 DP,状态定义和 一样。
在求出两个数组之后,枚举结点 为 "免费链" 的最下端结点,枚举 为 "dfn 比 小的选的个数", 即为 的最大可能贡献。其中 满足 。
之所以加上 ,是因为两个状态定义里 都是待定的,所以在最后把这个免费的 的权值加上。
【 任意】
这里不能按上面做的原因,是 的祖先可以选不止一个,在 中是一种选法,在 中又是不同的选法,情况不同当然不能直接合并。
那能不能让 的祖先的 呢?就相当于除了叶子结点的 都等于 。
事实上是可以的,我们拆点,若 ,给 额外拆出一个结点 作为儿子, 然后 。这是等价的。
题解区第一篇是按照后序遍历的 dfn 写的,本质相同。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!