关于错位排列

  今天弄了一下错位排列,似乎挺简单的。。。

  错位排列问题的描述大致如下:给定n个信封以及n个信箱,每个信箱只能容纳一个信封,第i号信需要放在第i号信封里,现在所有信封的位置都是错误的,求不同的错误方案数。

  因为第i号信是不在第i号信封里面的,这样的话我们可以模拟出以下n*n的矩阵(其中1表示信封错误的位置不能是此处):

  1,0,0,0

  0,1,0,0

  0,0,1,0

  0,0,0,1

  不难看出来,对于第一行来说我们有3种不同的方案,在某个点被占据时,其所在的排,列,都没有意义了,这样的话我们可以得到3个新的矩阵:

  1: 0,0,0    2:0,1,0        3: 0,1,0

      0,1,0          0,0,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、求方案数

原文地址:https://www.cnblogs.com/hinanawitenshi/p/6758873.html