标签:
2015-3-19 时限2天
一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级。
求总共有多少总跳法,并分析算法的时间复杂度。
首先考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。
现在我们再来讨论一般情况。我们把n级台阶时的跳法看成是n的函数,记为f(n)。
因此n级台阶时的不同跳法的总数f(n)=f(n-1)+f(n-2)。
我们把上面的分析用一个公式总结如下:
/ 1 n = 1
f(n)= 2 n = 2
\ f(n-1) + f(n-2) n > 2
原来上述问题就是我们平常所熟知的Fibonacci数列问题。可编写代码,如下:
long long Fibonacci(unsigned int n) { int result[3] = {0, 1, 2}; if (n <= 2) return result[n]; return Fibonacci(n - 1) + Fibonacci(n - 2); }
那么,如果一个人上台阶可以一次上1个,2个,或者3个呢?这个时候,公式是这样写的:
/ 1 n = 1
f(n)= 2 n = 2
4 n = 3 //111, 12, 21, 3
\ f(n-1)+f(n-2)+f(n-3) n > 3
如果有一对小兔,每一个月都生下一对小兔,而所生下的每一对小兔在出生后的第三个月也都生下一对小兔。那么,由一对新兔子开始,满一年时一共可以繁殖成多少对兔子?
f(1) = 1(第1个月有一对兔子) f(2) = 1(第2个月还是一对兔子) f(3) = 2(原来有一对兔子,第3个开始,每个月生一对兔子) f(4) = 3(原来有两对兔子,有一对可以生育) f(5) = 5(原来有3对兔子,第3个月出生的那对兔子也可以生育了,那么现在有两对兔子可以生育) f(6) = 8(原来有5对兔子,第4个月出生的那对兔子也可以生育了,那么现在有3对兔子可以生育) .............. 由以上可以看出,第n个月兔子的对数为 f(n) = f(n - 1) + f(n - 2); f(n-1)是上个月的兔子数量,是原来有的。 f(n-2)是可以生育的兔子数,即多出来的数量。第n-2个月开始后的第3个月是第n个月,此时第n-2个月时的兔子都可以生育了。
思考2:如果有一对小兔,每一个月都生下一对小兔,而所生下的每一对小兔在出生后的第k个月也都生下一对小兔。那么,由一对兔子开始,满一年时一共可以繁殖成多少对兔子?
这种情况下的推导公式怎么写?
f(n)=f(n-1)+f(n-k+1) 第n个月的数量正好是第n-1个月第n-k+1个月的数量 第n-k+1个月的数量可以视为 第n-k+1个月中已经具备繁殖能力的兔子和尚未具备繁殖能力的兔子总和, 他们都会在第n个月繁殖
练习:
http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1214
http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1347
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2290
标签:
原文地址:http://www.cnblogs.com/kylehz/p/4347220.html