【COCI 2012】Germ

题目大意

一棵 n 层的满二叉树,叶子从左到右编号为 0 2n1
现在你可以选择任意个非叶子节点,交换它们的左右儿子。
通过这种方式生成的所有序列 {A2n1} 中,求

2n2i=0WAi,Ai+1

的最小值。其中 W 是给定的 (2n1)×(2n1) 矩阵

n<=9

思路

骗分算法

f(l,r,x,y) 表示 [l,r) 区间中,最左是数 x ,最右是数 y ,最小的权值代价,转移很显然。
f(l,r,x,y)=f(l,mid,x,a)+f(mid,r,b,y)+Wa,b
理论上界时间复杂度 O((25n))

正解

fi,j 表示当前要放第 i 个位置,前一个数是 j 的最小代价。
假若直接枚举下一个取的数 k ,显然会有很多无效的状态。
哪些状态是有效的呢?
记lowbit=i&-i,则 lca(j,k) lowbit 的上一层。
那么 j k lowbit 这一位必须不同, lowbit 之前的位必须相同,后面的位随意。
不难得出 k 的可取范围为 [bg,en) ,其中
bg = (j^lowbit) & ~(lowbit-1)
en = bg + lowbit

理论时间复杂度上界 O(n3)

你可能感兴趣的:(【COCI 2012】Germ)