第一次用递归搞,很高兴结果对了(^_^)
悲催的的是提交之后,返回了一个 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 ;
}
通过这道题感觉到:数学好,才是真的好……