这里主要讲一下蓝书法一的等效方法的正确性。假设我们已经知道了最终的答案的树的样子,设为,设高度为,则答案为;设高度为的节点集合为,那么我们可以知道,在中删掉中的节点得到的新树的的代价就等于,如若不然,就说明的代价严格大于,此时向所代表的树加上(并且拓展的深度代价视为)得到树,可知,这就与是最优解矛盾,所以的代价就等于,于是可以直接按照深度代价为拓展,不会计算错误;同理可以证明,在中删掉所有高度为的节点(设为)后得到的树的代价仍然等于,依次类推,最终得到的答案就不会计算错误
然后讲一下蓝书的第二种方法,看了好久总算给我看懂了。我们考虑如下一种赋予树的边的深度权值的方法(每个节点都有唯一的指向父亲的边,以这个节点指代这条边):父亲的深度权值一定严格大于儿子的深度权值;所有边的深度权值一定为整数且不超过。设所有这种树的集合为,那么我们要求的最优的树也一定在中,我们只用求出中元素最优的一个就是答案。其实表示的是所有满足树的深度权值不超过且这个树的节点由组成的树中的最优解。不难知道,此时是二进制的话是推不走的,所以必须要是三进制,一个很自然的想法就是中为的点表示的是这个点的深度权值为,于是不能再从这个点往下拓展一层了。我们先不看书上的第三种转移,并且将第二种转移从只枚举变成枚举所有为的点,这样子是正确的,但是时间复杂度太大了,于是我们改成只枚举,并且加入第三种转移,此时中为的节点不仅仅表示深度权值为的点了,还表示不会继续拓展的点,之所以要这么表示是为了不遗漏最优答案,这样子表示之后就相当于进行了上面的枚举所有为的点的操作了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步