使用动态编程来计算排列的数量

时间:2014-01-01 09:31:10

标签: algorithm permutation dynamic-programming

我的字符串 A 的长度 N 。我必须找到长度为N的字符串数( B M(M <= N )与字符串 A 相同但满足所有i的 A [i]!= B [i] 的条件。假设必须给出必须相同和不同的字符。查找此类字符串数量的递归关系是什么?

示例

123是字符串A,M = 1,相同的字符是'1',新字符是'4'和'5'。有效排列是451,415,514,541。所以它是给定3中的1项的一种紊乱。

我能够使用包含 - 排除原则找到答案但是想知道是否存在相同的递归关系?

1 个答案:

答案 0 :(得分:1)

让我们将g(M,N)称为满足条件的排列数。

如果M为0,则答案为N!

否则,M> 0并考虑放置字符串A中的第一个字符。 M个重要位置对应于字符串中不允许放置某个字符的位置。

如果我们将第一个角色放在其中一个(M-1)重要位置(由于限制我们不能将它放在位置1),那么我们必须取代其中一个受限制的角色,所以限制数量减少2(我们放置的角色为1,而我们占据的角色为1)。

如果我们将第一个角色放在N-M不重要的地方之一,那么我们只将限制数量减少了1个。

因此,递归关系是:

g(M,N)=(M-1)g(M-2,N-1)+(N-M)g(M-1,N-1) if M>0
      =N! if M=0

对于您的示例,我们希望计算g(1,3)(1个字符匹配,总共3个字符)

g(1,3)=(3-1)g(0,2)
      =(3-1).2!
      =4