村民排队问题

在一个村庄里有 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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值