ACM-简单题之超级楼梯——hdu2041

超级楼梯
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 26862 Accepted Submission(s): 13830

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

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

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

Sample Input
2
2
3

Sample Output
1

2


好吧,第一反应,递归,看到M最大才40,

于是,果断TLE,%>_<%!

悲剧吧。。。。我还是太嫩太菜啊。。。


后来算了前5组数据,发现是斐波那契数列。。。

于是,又交WA!!( ⊙ o ⊙ )啊!

难道不是么?又想:难道是边算边打表?

就是递归+打表, 先给到前3个台阶赋值,

然后,i从4开始递归,如果传进函数的值对应的数组不为0,则返回数组内的值,

结果又WA。。。无奈了


最后发现,是我初始值赋错了,

我在本上写的1,2,3。。代表的是 中间差的台阶,我当成到第一个台阶,第二个台阶。。

改完了,交,果断AC啊。。。


好吧,我太粗心了,这个问题真不该发生啊!


// 超级楼梯

#include <iostream>
using namespace std;
int lt[43];

int main()
{
	int n,m,i;
	lt[1]=0;
	lt[2]=1;
	lt[3]=2;
	
	for(i=4;i<=42;++i)
		lt[i]=lt[i-1]+lt[i-2];
	cin>>n;
	while(n--)
	{
		cin>>m;
		cout<<lt[m]<<endl;
	}
	return 0;
} 

这个是用递归+打表做的

// 超级楼梯

#include <iostream>
using namespace std;
int lt[43];

int search(int n)
{
	if(lt[n]!=0)
		return lt[n];
	return	search(n-1)+search(n-2);
}

int main()
{
	int n,m,i;
	lt[1]=0;
	lt[2]=1;
	lt[3]=2;
	
	for(i=4;i<=42;++i)
		lt[i]=search(i);
	cin>>n;
	while(n--)
	{
		cin>>m;
		cout<<lt[m]<<endl;
	}
	return 0;
} 



你可能感兴趣的:(ACM,简单题,超级楼梯,hdu2041)