【问题标题】:Using dynamic programming to count the number of permutations使用动态规划计算排列数
【发布时间】:2014-01-05 11:30:08
【问题描述】:

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

示例

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

我可以使用包含-排除原则找到答案,但想知道是否存在重复关系来做同样的事情?

【问题讨论】:

  • 找到递归关系是一个数学问题,最好在这里问:math.stackexchange.com
  • @EmmadKareem 在这里我想知道如何应用 DP 来找到解决方案的数量,这就是我在这里问它的原因
  • @user2094963 A 是否具有所有唯一字符?
  • @SHB 你能和我们分享你的包含-排除方法吗?我用那种方法解决它有困难。

标签: algorithm permutation dynamic-programming


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多