您将获得一个整数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个字母表只能是互补的aplphabet,即如果第(n-2)个字母是A,然后第n个字母是C,反之亦然。但我觉得我错过了一些案例。
有没有更好的方法,有人可以帮助我吗?
答案 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
这是积分方程的简单解法