https://www.nowcoder.com/acm/contest/21/D
题意:递推
每一步只能迈1或2个阶梯,要求是先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完N(0<=N<=39)级台阶,计算方法总数。
Time Limit Exceeded
#include<stdio.h>
int fun(int n,int flag)
{
if(n==1)//若剩余一阶台阶
{
if(flag==1)//若最后一步是右脚 则方法数+1
{
return 1;
}
else//若是左脚 则方法数+0
{
return 0;
}
}
else if(n==2)//若剩余两阶台阶,都可以保证最后一步迈右脚 方法数+1
{
return 1;
}
return (fun(n-1,!flag)+fun(n-2,!flag));//轮流左右交替
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
//fun(台阶数量n,左脚为0[右脚为1])
printf("%d\n",fun(n,0));//先迈左脚
}
return 0;
}
思路:由于N的范围比较小,可通过枚举的方式解决超时问题。
可以通过上述程序事先计算按照要求上完N(0<=N<=39)级台阶的方法总数,存入数组中。
AC代码
#include<stdio.h>
int main()
{
int t,n;
int result[40]={0,0,1,2,2,4,7,10,17,28,44,72,117,188,305,494,798,1292,2091,3382,5473,8856,14328,23184,37513,60696,98209,158906,257114,416020,673135,1089154,1762289,2851444,4613732,7465176,12078909,19544084,31622993,51167078};
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%d\n",result[n]);
}
return 0;
}