CUMT OJ 1012 漫长的旅程===走台阶问题

1012: 漫长的旅程

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 395   Solved: 131
[ Submit][ Status][ Web Board]

Description

这次ACM/ICPC亚洲赛结束,我们从成都赛区要经过十分漫长的旅程才能返回徐州,所以我们不得不找点有趣的事情做(比如说出这次比赛的题目…o(><)o)我们就想呀,这个火车就不能少停几站吗?当然,铁老大是不会同意滴。不过,铁老大也并非这么死板,火车沿途也不是所有站台都停靠,偶尔也是会跳过一些小站的。铁老大表示,可以跳过一些小站,但是绝对不能连续跳过两站及以上,否则又要成为众矢之的了。现在,某条线上一共有m个站台(火车初始停靠在第一站),铁老大想知道一共有多少种停站方案可供选择,你能帮助铁老大解决这个问题吗?

Input

输入数据首先包含一个整数N(N<=40),表示测试实例的个数,然后是N行数据,每行包含一个整数M(2<=M<=40),表示该线站台的数量。

Output

每组输出仅有一行,包含一个整数,表示可供选择的方案数。

Sample Input

223

Sample Output

12

HINT


样例说明:

第一个2表示n为2,即一共有两组数据(实际测试数据不止两组);

第二个2表示第一组数据m为2,即一共有两站,而火车初始停靠在第一站,所以只有一种方案;

最后的3表示第二组数据m为3,即一共有三站,火车可以先开到第二站再到第三站,也可以直接开到第三站,所以有两种方案。

先贴一片RUNTIME ERROR的代码
#include<iostream>
using namespace std;
int f(int m,int n)
{
    if(m==0||n==0)      return 1;

    return f(m-1,n)+f(m,n-1);

} 
int main()
{
	int a;
	cin>>a;
	int i=0;
	while(a--)
	{
		int b;
		int sum=0;
		cin>>b;
		for(int y=1;y<40;y++)
		{
			if(b-y*2-1>=0)
			sum+=f(b-y*2-1,y);
			else break;
		}
		cout<<sum+1<<endl;
	}
	return 0;
}

主要问题出在递归上,所花时间太长,导致超时,经过修改后发现其中的规律了,其实是满足这个公式的
f(n)=f(n-1)+f(n-2);
……
f(2)=1;
f(3)=2;
递推公式
最好在统计的时候用long long,贴AC代码
#include<iostream>        //最终AC版 
using namespace std;

int main()
{
	int a;
	cin>>a;
	int i=0;
	while(a--)
	{
		int a;
		int sum=0;
		cin>>a;
		int *b=new int[43];
		b[2]=1;
		b[3]=2;
		if(a==2)
		{
			cout<<b[2]<<endl;
			continue;
		}
		if(a==3)
		{
			cout<<b[3]<<endl;
			continue;
		}
		for(int i=4;i<=a;i++)
		{
			b[i]=b[i-1]+b[i-2];
		}
		cout<<b[a]<<endl;
	}
	return 0;
}

其实这道题目就是走台阶问题,具体如下:
1. 楼梯有n个台阶,上楼可以一步上1阶,也可以一步上2阶,一共有多少种上楼的方法?
斐波那契数列  第一项为1 第二项为2 也就是f(n)=f(n-1)+f(n-2),用递归求。
给个分析的例子:
有一个11级的台阶,一个人可走一步也可走两步,问这个人有多少种方法走完这个台阶?
解:
①只用一步走:1+1+1+1+1+1+1+1+1+1+1=11,共11步,只有C11,1=1种走法。
②用了一次两步走:1+1+1+1+1+1+1+1+1+2=11,共10步,有C10,1 =10种走法。
③用了两次两步走:1+1+1+1+1+1+1+2+2=11,共9步,有C9,2 =36种走法。
④用了三次两步走:1+1+1+1+1+2+2+2=11,共8步,有C8,3= 56种走法。
⑤用了四次两步走:1+1+1+2+2+2+2=11,共7步,有C7,4=35种走法。
⑥用了五次两步走:1+2+2+2+2+2=11,共6步,有C6,1=6种走法。
总共有1+10+36+56+35+6=144种
理论上分析:只有一个台阶的话,只有1种走法,2级台阶的话,可以一步一个台阶走,也可以一步2个台阶走,共有2种走法。
当台阶数大于等于3之后,可以这么分析:如果最后一步走一个台阶,那么就是n-1个台阶的走法的种类,如果最后一步走两个台阶,那么就是n-2个台阶的走法的种类,所以n个台阶的走法种类就是n-1个台阶和n-2个台阶的走法的总和。因此,这是一个递归函数。也是一个裴波那契函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值