宝藏111

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值