您的位置:首页 > 其它

HDU(2041) (超级楼梯)

2014-02-27 14:58 197 查看
第一次用递归搞,很高兴结果对了(^_^)

悲催的的是提交之后,返回了一个 Time Limit Exceeded   

看来递归看似简单,其实相当复杂耗时。递归代码如下:

#include<iostream>
#include<stdio.h>
using namespace std ;
int count = 0 ;
void Search( int m )	{
if( m )	{
Search( m-1 ) ;
if(m-1)
Search( m-2 ) ;
}
else if( m == 0 )
count++ ;
}
int main()	{
int n ;
while( cin >> n )	{
while( n-- )	{
int m ;
cin >> m ;
count = 0 ;
Search( m - 1 ) ;
cout << count << endl ;
}
}
return 0 ;
}

尼玛,好不容易会用递归搞题了,结果超时,真受打击……不多说了,只有换一种非递归方法解决了:

第m级的走法如果等于第m-1级的走法,下一次只能走一级,只有这一种走法 ;

第m级的走法如果等于第m-2级的走法,下一次只能走两级,只有这一种走法 ;

所以推出公式:

(m)级的走法 = (m-1)级的走法 + (m-2)级的走法

#include<iostream>
#include<stdio.h>
using namespace std ;
int main()	{
int n ;
while( cin >> n )	{
while( n-- )	{
int a[50] = {0 , 0 , 1 , 2} ;
int m ;
cin >> m ;
for(int i = 4 ; i <= m ; i++)
a[i] = a[i-2] + a[i-1] ;
cout << a[m] << endl ;
}
}
return 0 ;
}


通过这道题感觉到:数学好,才是真的好……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: