鉴于NAA,NAB,NBA,NBB四个数字均小于或等于10 ^ 5.
需要查找仅包含AB字符的不同字符串的数量并包含:
我只知道蛮力解决方案。 你能不能给我一些提示或建议如何更快地完成它?
答案 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也不包含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的插入是独立的,我们可以简单地将这些数字相乘以获得所有可能性。
有四种情况需要考虑:
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)
N AB +1 = N BA :与上述相同只是在任何地方交换A和B
N AB = N BA : 该字符串以A开头,以A结尾或以B开头,以B结尾。因此,有两种可能需要添加。
字符串以A开头,给出N A = N AB +1,N B = N AB 子>
字符串以B开头,给出N A = N AB 和N B = N AB 1
所以,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 )
对于所有其他对N AB 和N BA :N = 0.
我希望,我的所有“-1”都是正确的。抱歉布局不好。