错位排列超详解(组合数学)

错位排列

全错位排列最经典的问题是装错信封问题。

我们把信封问题转换一下:

对于 1 − n 1-n 1n 共n个数字组成的序列中,每个数字仅出现一次,求每个数字跟位置完全不对应的总方案数。

  1. 对于第一个位置上的数字1它有 n − 1 n-1 n1 种方案数
    在这里插入图片描述
  2. 对于第二个位置上的数字2有两种放法:
    ①.放到1的位置上:
    这时候就是已经把1和2放置好,剩下 n − 2 n-2 n2个位置 d p [ n − 2 ] dp[n-2] dp[n2]
    在这里插入图片描述
    ②.放到后面 n − 2 n-2 n2个位置上
    这种情况其实就转换到了放数字1的情况(只是总数减一)
    它就相当于数字1已经放好了 还剩下 n − 1 n-1 n1个位置和 n − 1 n-1 n1个数,数字2不能在位置1处,也就是 d p [ n − 1 ] dp[n-1] dp[n1]的状态。
    在这里插入图片描述
    初始化状态: d p [ 1 ] = 0 ( 只 有 一 个 数 字 ) , d p [ 2 ] = 1 ( 两 个 数 字 ) dp[1]=0(只有一个数字),dp[2]=1(两个数字) dp[1]=0()dp[2]=1()
    转移 :第i个数有 i − 1 i-1 i1种方案,会转移到两种状态。
    d p [ i ] = ( i − 1 ) ∗ ( d p [ i − 1 ] + d p [ i − 2 ] ) ; dp[i]=(i-1)*(dp[i-1]+dp[i-2]); dp[i]=(i1)(dp[i1]+dp[i2]);

实现代码: d p [ i ] 表 示 i 个 数 错 位 排 列 的 方 案 数 dp[i]表示i个数错位排列的方案数 dp[i]i

	dp[1] = 0; dp[2] = 1;
	for(int i=3; i<=maxn; i++){
		dp[i] = (i-1) * (dp[i-1] + dp[i-2]) % mod;
	}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值