【问题标题】:Given a string formed only with 4 different letters, how many permutations of it exist with no two consecutive letters?给定一个仅由 4 个不同字母组成的字符串,它有多少个排列而没有两个连续的字母?
【发布时间】:2021-01-31 04:46:09
【问题描述】:

给定一个字符串S,由字母A、B、C、D组成,每个在中最多出现10次>S S 有多少个排列不包含 2 个连续字母?

举个例子

A: 3 times, B: 1 time, C: 1, D: 0

ABACA is valid
AABAC is invalid

我尝试了包含排除,但我的模型无法生成一组好的属性来使用该原则。

有公式还是我遗漏了什么?

【问题讨论】:

  • 我会说(来自combinationC(na, nb) * C(na + nb, nc) * C(na + nb + nc, nd)(以及处理na >= 1+nb+nc+nd的额外条件)。

标签: c++ dynamic-programming combinatorics


【解决方案1】:

动态规划

从头开始创建每个排列,因此您在字符串末尾一次添加一个字母 假设你刚刚使用了字母'A',下一个字母不能是'A',并且你的字母'A'比以前少了1个,所以你继续这个过程直到你用完字母

放手

f(prohibited, A, B, C, D)

大小为A + B + C + D的字符串的数量,可以用A字母'A',B组成字母 'B', ...并且此字符串不能以禁止开头

假设禁止等于“A”,那么您有 3 个选项可供选择:

从字母'B'开始,然后,下一次,禁止是'B',你有B - 1个字母'B',即

f('B', A, B - 1, C, D)

如果您选择了“C”而不是“B”,则禁止使用“C”并且您有 C - 1 个字母重复

总和也是如此

f('A', A - 1, B, C, D) + f('B', A, B - 1, C, D) ...

应该这样做。

【讨论】:

  • 一个好方法。请注意,记忆化有助于避免冗余计算
猜你喜欢
  • 1970-01-01
  • 2019-11-03
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 2016-08-22
  • 2018-11-07
相关资源
最近更新 更多