【问题标题】:Number of different strings having specified number of AB permutations具有指定数量 AB 排列的不同字符串的数量
【发布时间】:2016-01-30 12:05:09
【问题描述】:

给定四个数字 NAA、NAB、NBA、NBB,每个数字都小于或等于 10^5。

需要查找只包含AB字符且包含的不同字符串的个数:

  • “AA”的确切 NAA 出现;
  • 正是“AB”的 NAB 出现;
  • 正是 NBA 出现的“BA”;
  • 正是“BB”的 NBB 出现。

我只知道蛮力解决方案。 您能否给我一些提示或建议如何更快地做到这一点?

【问题讨论】:

  • 你在评论里说什么?请举例说明。
  • 根据您掌握的信息,您可以确定“A”的连续运行次数,分别。 “B”。因此,您以 ABABA... 和 BABABA.. 作为起点,然后计算有多少种方法可以使序列膨胀。谷歌整数分区。永远记住,你不需要构建序列来计算它们;-)

标签: dynamic-programming combinatorics


【解决方案1】:

您可以使用两个 5 维 DP 表,其中单元格状态定义为:

tableA[N][AA][BB][AB][BA] = no. of strings of length N ending at 'A' having AA times "AA", BB times "BB", AB times "AB" and BA times "BA" and
tableB[N][AA][BB][AB][BA] = no. of strings of length N ending at 'B' having AA times "AA", BB times "BB", AB times "AB" and BA times "BA"

现在您可以使用以下状态转换规则来填充表格:

tableA[N][AA][BB][AB][BA] = tableA[N-1][AA-1][BB][AB][BA] + tableB[N-1][AA][BB][AB][BA-1] and
tableB[N][AA][BB][AB][BA] = tableA[N-1][AA][BB][AB-1][BA] + tableB[N-1][AA][BB-1][AB][BA]

使用适当的基本案例并最终检索答案:

answer = tableA[AB][NAA][NBB][NAB][NBA] + tableB[AB][NAA][NBB][NAB][NBA]

【讨论】:

  • 感谢您的回复。由于使用了大量的内存,我担心这个解决方案将无法工作。
  • 我相信很快我就会找到答案,我会在这里发布。
【解决方案2】:

所以,是时候回答了。

给定一个字符串,您可以在不更改 NAB 和 NBA

的情况下进行以下转换
  • AA -> 一个
  • A -> AA
  • BB -> B
  • B -> BB

所以,我们可以通过“inflation”从既不包含 AA 也不包含 BB 的字符串开始得到任何有效的字符串。

充气

假设我们有一个没有 AA 和 BB 子串且 AB 和 BA 数量正确的字符串。

令 NA 为该字符串中 As 的数量,NB 为该字符串中 B 的数量(计算如下所示)。

比我们需要分配NAA至NA个地方。有 binom(NAA+NA-1, NA-1) 方法可以做到这一点(查找整数compositions) .还有 binom(NBB+NB-1, NB-1) 种可能性来放置额外的 B。因为 As 和 Bs 的插入是独立的,我们可以简单地将数字相乘以获得所有可能性。

计算实际结果

有四种情况需要考虑:

  1. NAB = NBA+1:字符串以A开头,以B结尾。NA=NB =NAB

    所以,N = binom(NAA+NAB-1, NAB-1) * binom(N BB+NAB-1, NAB-1)

  2. NAB+1 = NBA:同上,只是到处交换A和B

  3. NAB = NBA: 字符串要么以A开头以A结尾,要么以B开头以B结尾。所以有两种可能需要添加。

    1. 以 A 开头的字符串给出 NA=NAB+1 和 NB=NAB子>

    2. 以 B 开头的字符串给出 NA=NAB 和 NB=NAB +1

    所以,N = binom(NAA+NAB, NAB)*binom(NBB+NAB-1, NAB-1)

    + binom(NAA+NAB-1, NAB-1)*binom(NBB sub>+NAB, NAB)

  4. 对于所有其他 NAB 和 NBA 对:N=0。

我希望,我把所有的“-1”都弄对了。对于糟糕的布局,我们深表歉意。

【讨论】:

    猜你喜欢
    • 2017-03-20
    • 2021-11-13
    • 1970-01-01
    • 2013-05-23
    • 2017-07-08
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多