宝藏

这里主要讲一下蓝书法一的等效方法的正确性。假设我们已经知道了最终的答案的树的样子,设为T,设高度为h,则答案为f[h,(1<<n)1];设高度为h的节点集合为S,那么我们可以知道,在T中删掉S中的节点得到的新树的T1的代价就等于f[h1,(1<<n)1S],如若不然,就说明T1的代价严格大于f[h1,(1<<n)1S],此时向f[h1,(1<<n)1S]所代表的树加上S(并且拓展的深度代价视为h1)得到树T2,可知T2<T,这就与T是最优解矛盾,所以T1的代价就等于f[h1,(1<<n)1S],于是可以直接按照深度代价为i1拓展,不会计算错误;同理可以证明,在T1中删掉所有高度为h1的节点(设为S1)后得到的树T3的代价仍然等于f[h2,(1<<n)1SS1],依次类推,最终得到的答案就不会计算错误

然后讲一下蓝书的第二种方法,看了好久总算给我看懂了。我们考虑如下一种赋予树的边的深度权值的方法(每个节点都有唯一的指向父亲的边,以这个节点指代这条边):父亲的深度权值一定严格大于儿子的深度权值;所有边的深度权值一定为整数且不超过n。设所有这种树的集合为S,那么我们要求的最优的树也一定在S中,我们只用求出S中元素最优的一个就是答案。f[i,j]其实表示的是所有满足树的深度权值不超过i且这个树的节点由j组成的树中的最优解。不难知道,此时j是二进制的话是推不走的,所以j必须要是三进制,一个很自然的想法就是j中为2的点表示的是这个点的深度权值为i,于是不能再从这个点往下拓展一层了。我们先不看书上的第三种转移,并且将第二种转移从枚举x变成枚举所有1的点,这样子是正确的,但是时间复杂度太大了,于是我们改成枚举x,并且加入第三种转移,此时j中为2的节点不仅仅表示深度权值为i的点了,还表示不会继续拓展的点,之所以要这么表示是为了不遗漏最优答案,这样子表示之后就相当于进行了上面的枚举所有1的点的操作了

posted @   最爱丁珰  阅读(4)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示