宝藏
这里主要讲一下蓝书法一的等效方法的正确性。假设我们已经知道了最终的答案的树的样子,设为\(T\),设高度为\(h\),则答案为\(f[h,(1<<n)-1]\);设高度为\(h\)的节点集合为\(S\),那么我们可以知道,在\(T\)中删掉\(S\)中的节点得到的新树的\(T_1\)的代价就等于\(f[h-1,(1<<n)-1-S]\),如若不然,就说明\(T_1\)的代价严格大于\(f[h-1,(1<<n)-1-S]\),此时向\(f[h-1,(1<<n)-1-S]\)所代表的树加上\(S\)(并且拓展的深度代价视为\(h-1\))得到树\(T_2\),可知\(T_2<T\),这就与\(T\)是最优解矛盾,所以\(T_1\)的代价就等于\(f[h-1,(1<<n)-1-S]\),于是可以直接按照深度代价为\(i-1\)拓展,不会计算错误;同理可以证明,在\(T_1\)中删掉所有高度为\(h-1\)的节点(设为\(S_1\))后得到的树\(T_3\)的代价仍然等于\(f[h-2,(1<<n)-1-S-S_1]\),依次类推,最终得到的答案就不会计算错误
然后讲一下蓝书的第二种方法,看了好久总算给我看懂了。我们考虑如下一种赋予树的边的深度权值的方法(每个节点都有唯一的指向父亲的边,以这个节点指代这条边):父亲的深度权值一定严格大于儿子的深度权值;所有边的深度权值一定为整数且不超过\(n\)。设所有这种树的集合为\(S\),那么我们要求的最优的树也一定在\(S\)中,我们只用求出\(S\)中元素最优的一个就是答案。\(f[i,j]\)其实表示的是所有满足树的深度权值不超过\(i\)且这个树的节点由\(j\)组成的树中的最优解。不难知道,此时\(j\)是二进制的话是推不走的,所以\(j\)必须要是三进制,一个很自然的想法就是\(j\)中为\(2\)的点表示的是这个点的深度权值为\(i\),于是不能再从这个点往下拓展一层了。我们先不看书上的第三种转移,并且将第二种转移从只枚举\(x\)变成枚举所有为\(1\)的点,这样子是正确的,但是时间复杂度太大了,于是我们改成只枚举\(x\),并且加入第三种转移,此时\(j\)中为\(2\)的节点不仅仅表示深度权值为\(i\)的点了,还表示不会继续拓展的点,之所以要这么表示是为了不遗漏最优答案,这样子表示之后就相当于进行了上面的枚举所有为\(1\)的点的操作了