具有指定AB排列数的不同字符串的数量

时间:2016-01-30 12:05:09

标签: dynamic-programming combinatorics

鉴于NAA,NAB,NBA,NBB四个数字均小于或等于10 ^ 5.

需要查找仅包含AB字符的不同字符串的数量并包含:

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

我只知道蛮力解决方案。 你能不能给我一些提示或建议如何更快地完成它?

2 个答案:

答案 0 :(得分:0)

您可以使用两个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]

答案 1 :(得分:0)

所以,回答时间。

给定一个字符串,您可以执行以下转换而不更改N AB 和N BA

  • AA - > A
  • A - > AA
  • BB - >乙
  • B - > BB

因此,我们可以通过“通货膨胀”从既不包含AA也不包含BB的字符串开始到达任何有效字符串。

膨化

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

设N A As的数量和N B 该字符串中B的数量(这些的计算如下所示)。

我们需要将N AA 分配给N A 的地方。有binom(N AA + N A -1,N A -1)这样做的方法(查找整数{{3} })。还有binom(N BB + N B -1,N B -1)放置额外Bs的可能性。因为As和Bs的插入是独立的,我们可以简单地将这些数字相乘以获得所有可能性。

计算实际结果

有四种情况需要考虑:

  1. N AB = N BA +1:该字符串以A开头,以B结尾.N A = N <子>乙 = N <子> AB

    所以,N = binom(N AA + N AB -1,N AB -1)* binom(N BB + N AB -1,N AB -1)

  2. N AB +1 = N BA :与上述相同只是在任何地方交换A和B

  3. N AB = N BA : 该字符串以A开头,以A结尾或以B开头,以B结尾。因此,有两种可能需要添加。

    1. 字符串以A开头,给出N A = N AB +1,N B = N AB

    2. 字符串以B开头,给出N A = N AB 和N B = N AB 1

    3. 所以,N = binom(N AA + N AB ,N AB )* binom(N BB + N AB -1,N AB -1)

      + binom(N AA + N AB -1,N AB -1)* binom(N BB + N AB ,N AB

    4. 对于所有其他对N AB 和N BA :N = 0.

    5. 我希望,我的所有“-1”都是正确的。抱歉布局不好。