【Rosalind】Rabbits and Recurrence Relations

题目描述

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 , π ) (\pi, -\sqrt{2}, 0, \pi) (π,2 ,0,π) and the infinite sequence of odd numbers ( 1 , 3 , 5 , 7 , 9 , … ) (1, 3, 5, 7, 9, \ldots) (1,3,5,7,9,). We use the notation a n a_n an to represent the -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 F n F_n Fn represents the number of rabbit pairs alive after the n-th month, then we obtain the Fibonacci sequence having terms F n F_n Fn that are defined by the recurrence relation F n = F n − 1 + F n − 2 F_{n} = F_{n-1} + F_{n-2} Fn=Fn1+Fn2 (with F 1 = F 2 = 1 F_1 = F_2 = 1 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 n \leq 40 n40 and k ≤ 5 k \leq 5 k5.

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).

Sample Dataset

5 3

Sample Output

19

题解

类似斐波那契数列,递推公式如下:
F n = { 1 ( n = 1 , 2 ) F n − 1 + k × F n − 2 ( n ≥ 3 ) F_n=\left\{ \begin{array}{lcl} 1 & (n=1,2)\\ F_{n-1}+k\times F_{n-2} & (n\ge 3) \end{array} \right. Fn={1Fn1+k×Fn2(n=1,2)(n3)
可利用矩阵进行优化:
A n − 1 = [ F n F n − 1 ] A 1 = [ 1 1 ] K = [ 1 k 1 0 ] A n − 1 = K n − 2 × A 1 A_{n-1}=\left[ \begin{matrix} F_n\\F_{n-1} \end{matrix} \right]\\ A_1=\left[ \begin{matrix} 1\\1 \end{matrix} \right]\\ K=\left[\begin{matrix} 1 & k\\ 1 & 0 \end{matrix} \right]\\ A_{n-1}=K^{n-2}\times A_1 An1=[FnFn1]A1=[11]K=[11k0]An1=Kn2×A1
利用快速幂算法可缩短其时间复杂度至 O ( l o g 2 n ) O(log_2n) O(log2n)

参考代码

from numpy import *
import numpy as np
import re

with open("rosalind_fib.txt", "r") as f:
	s = f.readline()
	s = re.split(r" ", s)
	n = int(s[0])
	k = int(s[1])
	f.close()

K = mat(array([[1, k], [1, 0]]))
A1 = mat(array([[1], [1]]))
Ans = (K ** (n-2)) * A1

print(Ans[0, 0])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值