如何找到选择3种类型k对象的方式的数量

时间:2015-12-29 05:20:39

标签: algorithm dynamic-programming combinatorics

您将获得一个整数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),您可以使用大小为kf(1) = 2 {A, C}以及f(2) = 4 {AA, AC, CA, CC}的数组,

所以如果第(n-1)个字母表是A或C,那么第n个字母表可以是A或C,但是如果它是B,那么第n个字母表只能是互补的aplphabet,即如果第(n-2)个字母是A,然后第n个字母是C,反之亦然。但我觉得我错过了一些案例。

有没有更好的方法,有人可以帮助我吗?

3 个答案:

答案 0 :(得分:0)

<强> [编辑]

递归:

F(1) = 2
F(2) = 4
F(N) = 2 * F(N - 1) + F(N-2)

说明: 任何有效组合以A或C结尾。
为了进行n组合,我们可以将A和C添加到任何(n-1)组合 - 两种变体 我们还有一个变体,添加到(n-2)个组合:BA表示xxxxC,BC表示xxxxA

答案 1 :(得分:0)

设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

或者,就像我们对Fibonacci系列一样,我们可以使用矩阵求幂来解决它,这可以在O(log n)算术运算中完成。

L(n) = the first component of [0 1]^n (0)
                              [1 2]   (2)

答案 2 :(得分:0)

这是一个通用的解决方案。假设您有for i, rows in df1.iterrows(): if rows.Buy == 'purchase': df3.ix[rows.Day,rows.Type] = row.AmountOfCars df3.ix[row.day, 'Money '] -= df3.ix[row.Day,rows.type] * df2??? df1(amount) Audi BMW Buy 2010-03-16 2000 4000 purchase 2010-04-19 2500 4500 sold df2(prices) Audi BMW 2010-03-16 450000 350000 2010-04-19 6500000 350300 df3(totals) Audi BMW Money 2010-03-16 2000 4000 ? 2010-04-19 -2500 -4500 ? 个对象,则必须从中选择n个对象。您可以从每种类型中选择k个对象。 和他们的总和

x1,x2,x3..

因此,如果您可以选择每个对象(x1+x2+x3...+xn=k 0<=xi ),答案将为0<=xi

这是积分方程的简单解法