算法习题27:跳台阶问题

题目:一 个台阶总共有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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值