[英]how to find the number of ways of choosing k objects of 3 types
给您一个整数k
和3种类型的对象-A,B和C,每种类型都有大量的对象。 您可以用多少种方式排列k
对象,以便您可以选择任意次数的任何类型的对象,但要限制B始终位于A和C之间,或者C和A之间。
例如,如果k为3,则答案为:10解释:{AAA,AAC,ABC,ACA,ACC,CAA,CAC,CBA,CCA,CCC}
我试图使用动态编程来解决它,但是我不知道这是否是正确的方法。
我尝试过这样的事情: f(n) = 2*f(n-1) + f(n-2)
,其中您采用了大小为k
的数组,而f(1) = 2 {A, C}
和f(2) = 4 {AA, AC, CA, CC}
,
因此,如果第(n-1)个字母是A或C,那么第n个字母可以是A或C,但是如果它是B,则第n个字母只能是互补的全名,即,如果第(n-2)个字母是A,则第n个字母为C,反之亦然。 但是我觉得我想念一些案件。
有没有更好的方法,有人可以帮助我吗?
将帖子
递归:
F(1) = 2
F(2) = 4
F(N) = 2 * F(N - 1) + F(N-2)
说明:任何有效的组合都以A或C结尾。
要进行n组合,我们可以将A和C都添加到任何(n-1)组合中-两个变体。
我们还有一个变体,增加了(n-2)种组合:xxxxC的BA和xxxxA的BC
令L为此类字符串的语言,而La和Lc为字符串分别以A或C结尾的语言的子集。
然后,我们可以编写明确的语法:
L = La | Lc
La = "A" | L + "A" | Lc + "BA"
Lc = "C" | L + "C" | La + "BC"
令L(n),La(n),Lc(n)为三种语言中每种语言的长度为n的字符串数。 通过对称,La(n)= Lc(n)= L(n)/ 2。
然后,从第二个方程式中,使用语法无歧义的事实,对于n> 1,La(n)= L(n-1)+ Lc(n-2),然后代入:L(n)= 2L(n-1)+ L(n-2)。 我们有L(0)= 0和L(1)= 2。
为了计算L,我们可以编写迭代代码(您可以将其称为动态编程):
def L(n):
a, b = 0, 2
for _ in xrange(n):
a, b = b, a + 2 * b
return a
或者,就像我们对斐波那契数列所做的那样,我们可以使用矩阵求幂来解决它,这可以在O(log n)算术运算中完成。
L(n) = the first component of [0 1]^n (0)
[1 2] (2)
这是一个广义的解决方案。 假设您有n
个对象,并且必须从其中选择k
对象。 您可以从每种类型中选择x1,x2,x3..
对象。 和他们的总和
x1+x2+x3...+xn=k 0<=xi
因此,假设您可以选择是否选择每个对象( 0<=xi
),答案将是(k+n-1)C(n-1)
这是积分方程的简单解决方案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.