Python 使用k个字符形成长度为n的字符串的方法的数量,这样最多两个相邻字符可以相同

Python 使用k个字符形成长度为n的字符串的方法的数量,这样最多两个相邻字符可以相同,python,algorithm,dynamic-programming,combinatorics,Python,Algorithm,Dynamic Programming,Combinatorics,嗨,请务必让我知道我的重复关系出了什么问题 我的逻辑是: 分配第一个元素的方法数=k和使下一个(n-1)元素不同的方法数(k-1)*f(n-2) 以及分配两个相同元素的方法的数量:k+(k-1)*f(n-1) 因此,这种关系: 路径数=∑(k+(k-1)*f(n-1)+k+(k-1)*f(n-1)) 我可以看到一些错误,例如包含重复项,但是,我无法找出关系 您还可以在下面找到代码: def count_num_ways(n, k): dp = [0 for i in ra

嗨,请务必让我知道我的重复关系出了什么问题

我的逻辑是:

分配第一个
元素的方法数=k
和使
下一个(n-1)
元素不同的方法数
(k-1)*f(n-2)

以及分配两个相同元素的方法的数量:
k+(k-1)*f(n-1)

因此,这种关系:

路径数=∑(k+(k-1)*f(n-1)+k+(k-1)*f(n-1))

我可以看到一些错误,例如包含重复项,但是,我无法找出关系

您还可以在下面找到代码:

    def count_num_ways(n, k):
        dp = [0 for i in range(n+1)]

        dp[0] = 0
        dp[1] = k

        for i in range(2, n+1):
            dp[i] =  sum(
                [
                     k+( k-1 )*dp[n-2],
                     k+(k-1)*dp[n-1]-k
                ]
            )

        print(dp)
谢谢。

f(n)
等于形成n个元素的方法数,而最后两个字符相同

---+-+-+-+-+---+-+
...|a|a| | |...| |
---+-+-+-+-+---+-+
        \---v---/
            n
f(n) = number of ways to fill these n elements.
g(n)
等于形成n个元素的方法数,而最后两个字符不同

---+-+-+-+-+---+-+
...|a|b| | |...| |
---+-+-+-+-+---+-+
        \---v---/
            n
g(n) = number of ways to fill these n elements.
正如
f(n)
,由于最后两个字符相同,我们需要选择一个不同的字符,即
(k-1)
,最后两个字符将不同,即
g(n-1)
,结果是:

f(n) = (k-1)*g(n-1)
g(n) = 1*f(n-1) + (k-1)*g(n-1)
正如
g(n)
,由于最后两个字符不同,我们可以选择相同的字符或不同的字符。对于第一种情况,相同的字符是唯一的选择:
1
,最后两个字符是相同的:
f(n-1)
。对于第二种情况,不同的字符选项:
(k-1)
和不同的函数:
g(n-1)
,结果是:

f(n) = (k-1)*g(n-1)
g(n) = 1*f(n-1) + (k-1)*g(n-1)
对于第一个元素,我们选择一个字符
k
,答案是

k*g(n-1)
附言: 在第二个等式中,你可以用
f(n-1)
代替,但我认为这更直观

代码 下面是一个Python代码示例

def f(n):
    if n == 0:
        return 1
    return (k-1)*g(n-1)


def g(n):
    if n == 0:
        return 1
    return f(n-1) + (k-1)*g(n-1)


n, k = 4, 2

print(k*g(n-1))

根据你的问题,我得出
2
结论:

  • 形成字符串时,可以多次使用同一字符
  • k>1
    ,因为如果不是这样,解决方案将不存在于
    n>2
  • 在这种情况下,这是一个典型的组合数学问题,你可以用一个简单的数学公式来计算组合的数量。需要考虑<代码> 2 \代码>实例-所有相邻字符是不同的,而2个相邻字符完全相同。

    解释 案例A-所有相邻字符都不同 有
    k
    方法可以选择字符串中的第一个字符。对于下一个字符,总是有
    k-1
    方法(它们必须不同!)。因此,组合的总数是k(k-1)n-1

    案例B-两个相邻字符相同 假设
    2
    相同的字符是字符串的第一个和第二个字符。有
    k
    方法可以创建这样的对,因为两个元素是相等的!然后,对于字符串中的每个其他位置,都有
    k-1
    方法来选择字符

    什么,如果一对相同的元素是在中间还是在末端?好的,组合的数量将保持不变-总是
    k
    方法来选择字符串中的第一个元素,并且
    k-1
    方法来选择其他元素。如果
    2
    位置必须由相等的字符占据,那么像以前一样,有
    k-1
    方法来设置它们。其中,对于固定对位置存在k(k-1)n-2

    由于此类位置的数量为
    n-1
    ,因此组合的数量为(n-1)k(k-1)n-2

    结果
    因此,组合的总数是k(k-1)n-1+(n-1)k(k-1)n-2。注意:

    我的解释中的字符位置从1开始,因此第一个字符在位置1,第二个字符在位置2,依此类推

    让我们定义一下:

    • 有效字符串
      :使用
      k
      字符形成的字符串,最多两个相邻字符可以相同

    • f(n)
      :长度为
      n
      有效字符串的数目和最后两个字符不同

    • g(n)
      :长度为
      n
      有效字符串的数量和最后两个字符相同

    • h(n)
      :长度
      n
      有效字符串的数目


    假设你已经计算了所有
    m Hi@Cahid-Enes-Keleş的
    f(m)
    g(m)
    的值,它不应该是f(n)=(k-1)*g(n-2)而不是第一个等式中的f(n)=(k-1)*g(n-1)?还有,你如何在代码中实现两个同时的递归关系?想法是正确的,但f(n)=g(n-1)和g(n)=(k-1)(f)(n-1)+g(n-1)),g(1)=k,f(1)=0,答案是f(n)+g(n)@SanskarJethi我想我对
    f
    g
    的定义不清楚。我更新了它们,如果它们仍然不清楚,请留下评论。我还添加了示例代码。@MattTimmermans您的关系也是正确的,对于
    f
    g
    的不同定义。请查看更新后的答案以了解我想要的定义Hi@anatolii,这个解决方案在我看来也不错,但我在寻找一个递归关系,而不是一个解决问题的不同方法。