Problem
A sequence is an ordered collection of objects (usually numbers), which are allowed to repeat. Sequences can be finite or infinite. Two examples are the finite sequence (π,−2√,0,π) and the infinite sequence of odd numbers (1,3,5,7,9,…) . We use the notation an to represent the n -th term of a sequence.
A recurrence relation is a way of defining the terms of a sequence with respect to the values of previous terms. In the case of Fibonacci's rabbits from the introduction, any given month will contain the rabbits that were alive the previous month, plus any new offspring. A key observation is that the number of offspring in any month is equal to the number of rabbits that were alive two months prior. As a result, if Fn represents the number of rabbit pairs alive after the n -th month, then we obtain the Fibonacci sequence having terms Fn that are defined by the recurrence relation Fn=Fn−1+Fn−2 (with F1=F2=1 to initiate the sequence). Although the sequence bears Fibonacci's name, it was known to Indian mathematicians over two millennia ago.
When finding the n -th term of a sequence defined by a recurrence relation, we can simply use the recurrence relation to generate terms for progressively larger values of n . This problem introduces us to the computational technique of dynamic programming, which successively builds up solutions by using the answers to smaller cases.
Given: Positive integers n≤40 and k≤5 .
Return: The total number of rabbit pairs that will be present after n months if we begin with 1 pair and in each generation, every pair of reproduction-age rabbits produces a litter of k rabbit pairs (instead of only 1 pair).
斐波那契数列的一点改变,生育年龄的兔子每次生育不止一个兔子。所以公式修改为Fn=Fn−1+K*Fn−2
使用dp,就是不要按照题面意思用递归了,算过的就不算了,这样时间复杂度大大下降O(n)
本来想用dict,实现一个map,然后判断序列每个数字是否算过了,最后还是建了两个list
搞不懂 input 的值为什么都视为 str ,python 3里 input 和raw_input 是一样的,没有raw_input 了。但是必须把变量转换成int 才能算,不知道为什么。
还有就是对于list 未定义的区域,一定要先初始化值,不然直接使用会冒出奇怪的数字。 先 append(0)
n=input("n is:\n")
k=input("k is:\n")
#dynamic programming
f_seq=[1,1];
bool_list=[1,1,0];
for i in range(2,int(n)):
if(bool_list[i]==0):
f_seq.append(f_seq[i-1]+int(k)*f_seq[i-2])
bool_list[i]=1
bool_list.append(0)
i+=1;
else:
bool_list.append(0)
i+=1;
print(f_seq[int(n)-1]);