HDU(2041) (超级楼梯)

来源:互联网 发布:数据线头那边怎么缠 编辑:程序博客网 时间:2024/05/07 00:03

第一次用递归搞,很高兴结果对了(^_^)

悲催的的是提交之后,返回了一个 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 ;}

通过这道题感觉到:数学好,才是真的好……

0 0
原创粉丝点击