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
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,这个解决方案在我看来也不错,但我在寻找一个递归关系,而不是一个解决问题的不同方法。