在一个村庄里有 N ( 1< N < 4000 ) 个村民,让他们排队,要求任何人不能在他的父亲的前面,一共有多少种排法?
有父子关系的村民可以组成一颗树,所有这些树加上一个虚拟根结点组成一颗树,其结点数目为 N+1;
定义 f(r) 为以 r 为根结点的树对应的排列数目,s(r) 为以 r 为根结点的树的结点个数;对 r 树来说,在 s(r) 个位置中第一个位置分配给 r ,其他 s(r)-1 个位置分配给其子树中的结点;假设 r 结点有 n 个子树为 c1, c2, ... , ck,从 s(r)-1个位置中为每颗子树选择空间,不同的分配方法有:(s(r)-1)! / (s(c1)!s(c2)!...s(ck)!),所以有递推关系:
f(r) = f(c1)f(c2)...f(ck)(s(r)-1)! / (s(c1)!s(c2)!...s(ck)!)
边界条件为:如果 c 是叶子结点 f(c)=1
将 f(c1)...f(ck) 等展开得到表达式:f(root) = (s(root)-1)!/s(c1)/s(c2)/.../s(cn) = n! / s(c1) / s(c2) / ... / s(cn) 其中c1 ... cn 为树中每一个结点。
参考《算法竞赛入门经典》,刘汝佳,陈锋,P111