您的位置:首页 > 其它

HDU - 2041 C - 超级楼梯B 和HDU - 2044 一只小蜜蜂(递归)

2017-09-06 23:45 302 查看

C - 超级楼梯

(和小蜜蜂几乎雷同,小蜜蜂见其他文章)

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

Input

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

Output

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

Sample Input

2

2

3

Sample Output

1

2

解题思路:

假设走m级楼梯,有fun(m)种方法。

如果有m级楼梯要走,那么我先从最高级楼梯开始,走第一步,那么这一步就有两种走法:

第一种:走一级台阶,那么这时剩下步骤就有fun(m-1)种走法。

第二种:走两级台阶,那么这时剩下步骤就有fun(m-2)种走法。

所以fun(m)=fun(m-1)+fun(m-2)

#include <stdio.h>
int fun(int m)
{
if(m==1||m==2)return 1;
if(m>2) return fun(m-1)+fun(m-2);
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int m;
scanf("%d",&m);
printf("%d\n",fun(m));
}
return 0;
}


不过这种递归的方法,时间复杂度有时比较高,那么我们一般遇到这种题目,主要是用数组将所计算出的数据直接存下来,然后再输出。

如下:

#include<stdio.h>
int main()
{
int n,m;
int a[45],i;
a[1]=0;
a[2]=1;
a[3]=2;
for(i=4;i<=40;i++)
a[i]=a[i-1]+a[i-2];
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
printf("%d\n",a[m]);
}
return 0;
}


一只小蜜蜂

有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。

其中,蜂房的结构如下所示。



Input

输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b.其中(0《 a《 b《 50 )《表示小于。

Output

对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行。

Sample Input

2

1 2

3 6

Sample Output

1

3

#include <stdio.h>
int main()
{
int n,i;
long long a[50];
a[1]=1;
a[2]=2;
for(i=3;i<=50;i++)
a[i]=a[i-1]+a[i-2];
scanf("%d",&n);
{
while(n--)
{
int x,y,m;
scanf("%d%d",&x,&y);
m=y-x;
printf("%lld\n",a[m]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: