首页 > 代码库 > 关于错位排列
关于错位排列
今天弄了一下错位排列,似乎挺简单的。。。
错位排列问题的描述大致如下:给定n个信封以及n个信,每个信只能容纳在,第i号信需要放在第i号信封里,现在所有信封的位置都是错误的,求不同的错误方案数。
因为第i号信是不在第i号信封里面的,这样的话我们可以模拟出以下n*n的矩阵(其中1表示信封错误的位置不能是此处):
1,0,0,0 不难看出来,对于第一行来说我们有3种不同的方案,在某个点被占据时,其所在的排,列,都没有意义了,这样的话我们可以得到3个新的矩阵:
0,1,0,0 1: 0,0,0 2:0,1,0 3: 0,1,0
0,0,1,0 0,1,0 0,0,0 0,0,1
0,0,0,1 0,0,1 0,0,1 0,0,0
显然这三个矩阵我们可以转化成相同的,那么仅对矩阵1来判断,当其占据左上角的点时,其又产生了一个n=2的n*n的满足题意的新矩阵,那么这就是一个子问题,而不占据左上角的点时,其右上角的点可以转化为1,那么又产生了一个n=3的n*n的满足题意的新矩阵,这是另一个子问题。
不难得出f[1]=0,f[2]=1;
那么对于第一行上的每个可占据的点来说,都有其剩余方案数=f[i-1]+f[i-2]
因此我们就得到了递推式:f[i]=(i-1)*(f[i-1]+f[i-2])
考虑一下这个递推式的普适性:
只要满足矩阵中所有为1的点,两两之间均不出现在同一列,且每一行上均有且只有一个点为1,那么我们就一定能够将这个矩阵转化为错位排列的标准矩阵
因此只要题意满足以下两点,我们均可用该递推式解出
1、每行、每列上保证有且仅有1个点为1
2、求方案数
关于错位排列