递推之错排公式

这是在课本上有的一道题,自己认为是初级递推里比较难想进去的题了(对我这个小白来说),就此参考各方资源,归纳一下。


错排问题(全错位排列问题 Derangement)

概念:
考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错排。 n个元素的错排数记为D(n)。 研究一个排列错排个数的问题,叫做错排问题或称为更列问题。

典型例子:
1. 一个人写了n封不同的信及相应的n个不同的信封,他把这n封信都装错了信封,都装错信封的装法有多少种(历史有名的“装错信封问题”);
2. 将一排书重新摆放,要求每本书都不摆在原来的位置,一共有几种不同的摆法;
3. [SDUT 2058] 小厮将每一封信都投错了烽火台(一个烽火台一封),一共有多少种可能的情况;
4. 几个人各写一张贺年卡互相赠送,共有多少种赠送方法(因为不能送自己)。

错排公式

组合数学上的错排公式:
D(n) = n! [(-1)^2/2! + … + (-1)^(n-1)/(n-1)! + (-1)^n/n!]
简化版本:
D(n) = [n!/e+0.5] ,其中e是自然对数的底,[x]为x的整数部分

这个公式放这里目前就用来涨涨自己的见识。它可以通过容斥原理来推导,也可以通过递推推导,而递推公式即我们的重点。

递推推导过程

当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.

  • 第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;

  • 第二步,放编号为k的元素,这时有两种情况:
    ⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;
    ⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;

  • 综上得到
    D(n) = (n-1) [D(n-2) + D(n-1)]
    特殊地,D(1) = 0, D(2) = 1

代码实现

int D(int n)
{
    if (n == 0 || n == 1)
        return 0;
    else if (n == 2)
        return 1;
    else
        return (n-1) * (D(n-2) + D(n-1));
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值