算法习题27:跳台阶问题
2013-10-22 10:07
309 查看
题目:一个台阶总共有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
求总共有多少总跳法,并分析算法的时间复杂度。
这道题最近经常出现,包括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; }
相关文章推荐
- 微软算法100题27 跳台阶问题
- 剑指offer-算法题练习:part9 变态跳台阶-斐波那契数列问题
- 上台阶问题的算法
- 【算法】跳台阶问题
- 【算法27】硬币面值组合问题
- 算法笔记_046:跳台阶问题(Java)
- 算法习题40:设计最小栈,首尾相连珠子问题,系统设计问题
- NP问题——证明EXACT 4SAT问题是NP完全问题(算法概论习题8.8)
- 【算法13】跳台阶问题
- 程序员面试题精选100题(23)-跳台阶问题[算法]
- 剑指offer-算法题练习:part8 跳台阶-斐波那契数列问题
- 上台阶、硬币问题的算法
- 跳台阶问题(27)
- IT公司100题-27-跳台阶问题
- (1.1.7.1)上台阶、硬币问题的算法
- 面试算法学习-7-跳台阶问题
- 算法教程2:39级台阶问题
- No27、跳台阶问题(递归)
- [算法概论习题] 证明 EXACT 4SAT 是 NP-complete 问题
- 算法-网易笔试 台阶石板约数问题(回退)