算法习题27:跳台阶问题

来源:互联网 发布:淘宝影响二次销售定义 编辑:程序博客网 时间:2024/05/18 02:35
题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。
求总共有多少总跳法,并分析算法的时间复杂度。

这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都

曾先后选用过个这道题作为面试题或者笔试题。

-----------------------------------------------------------------------------

这道题咋一看确实没啥思路,可是前几天做的那道题:求出所有和为某个数的加数(见http://blog.csdn.net/ylf13/article/details/12869227)

给了我很大的影响,自己傻傻的模拟了背包整个过程,发现是多么痛苦,后来上网搜了,发现用数学公式可以如此简化问题,于是现在看到算法题第一件事就是是否有某个类似动态规划的公式可以归纳出呢??

这道题我看已知就只有总级数N,我们一步步考虑,如果最后一步用的是一步跳就跳到终点,以及最后一步使用两步跳到终点,就这两个结果,而且恰好是一个补集,所以这个过程也可以写成f(n)=f(n-1)+f(n-2) 那么,这个模型就出来了!这是一个类似背包过程的,而且从公式看,多么熟悉,不就是斐波那契数列么!!两种方法,递归+循环

当然当然,这个也可以模拟背包过程:现在给出n个1 以及n/2个2,这么一个数列,而且已经按顺序排好,那么接下来找出所有和为N的组合?

这就是这道题的变形了?如果看到这样的题目知道思路了把!公式就会换成f(n,m)给了m个数字,求和等于N,可以写成f(n,m-1)+f(n-2(*) ,m-1)

这里2我标记程*号是因为当,m<n以后就是1 了,这个大家可以考虑过程就好了,写就算了,确实费脑细胞

还是那句话,大家坚持,就会有收获http://bbs.csdn.net/topics/350118968

//============================================================================// Name        : JumpStep.cpp// Author      : YLF// Version     :// Copyright   : Your copyright notice// Description : Hello World in C++, Ansi-style//============================================================================#include <iostream>using namespace std;int JumpStep(int n);int JumpStep2(int n);int main() {int stepN = 0;cin>>stepN;//cout<<JumpStep(stepN);cout<<JumpStep2(stepN);return 0;}int JumpStep(int n){if(n<0)return -1;if(n == 1)return 1;if(n == 2)return 2;return JumpStep(n-1) + JumpStep(n-2);}int JumpStep2(int n){if(n<0)return -1;int i = 0;if(n == 1)return 1;if(n == 2)return 2;int sum = 0, a1 = 1, a2 = 2;for(i=3;i<=n;i++){sum = a1 + a2;a1 = a2;a2 = sum;}return sum;}