您的位置:首页 > 其它

hdoj-2041 超级楼梯【递归】

2015-08-03 15:58 246 查看
题目详见链接http://acm.hdu.edu.cn/showproblem.php?pid=2041



超级楼梯

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 38431 Accepted Submission(s): 19778



Problem Description
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?




Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。




Output
对于每个测试实例,请输出不同走法的数量




Sample Input
2
2
3






Sample Output
1
2


一楼梯共M级,刚开始在第一级,若每次只能跨上一级或二级,

要走上第M级,共有多少种走法?(1<=m<=40)

解题思路:类似于斐波那契(Fibonacci)数列

1.递推 f(1)=0,f(2)=1,f(3)=2;(前三项无规律,从第四项开始)

2.当要走向n级的时候,有两种情况:

(1) 先走向(n-1)级,有f(n-1)种情况,再一次走一级,只有一种选择;

(2) 先走向(n-2)级,有f(n-2)种情况,再一次走二级,只有一种选择

所以f(n)=f(n-1)+f(n-2);



<span style="font-size:14px;">#include<stdio.h>
int main()
{
	int n;
	int a[50];
	scanf("%d",&n);
	while(n--)
	{
		int m,i;
		scanf("%d",&m);	
		a[1]=0;
		a[2]=1;
		a[3]=2;//前三项不满足 a[i]=a[i-1]+a[i-2]
		for(i=4;i<=m;i++)
			a[i]=a[i-1]+a[i-2];//从第四项开始 
		printf("%d\n",a[m]);
	}
	return 0;
}

</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: