2018HPU暑期集训——动态规划入门
F - 超级楼梯
https://vjudge.net/contest/244694#problem/F
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
Output
对于每个测试实例,请输出不同走法的数量
Sample Input
2
2
3
Sample Output
1
2
思路:
每次有2种走法,并且要求最后还能干好到达M级。
正着不行,逆向思维一下,要达到最后一级的前一级只能是M-1或者M-2;
也就是说就是到达M-1的走法加上M-2的走法相加就等于到达最后一级的走法。
所以递推公式:
F(n)=F(n-1)+F(n-2);
F(1)=1,F(2 )=2;
这就是斐波那契数列:每个数都等于它的前两个数字和(前2个除外);
如果要走到第4层,那么可以在第3层走一步或者在第2层走两步 ,那么如果走到第2层有a种走法,走到第3层有b种走法,那么走到第4层就有a+b中走法
代码:
#include <stdio.h>
int main()
{
int n,a[100],i;
a[2]=1;//本来站在第一级楼梯上,要走到第二级楼梯只有一种走法
a[3]=2;// 从第一级走到第三级有2种走法
for(i=4;i<=40;i++)
a[i]=a[i-1]+a[i-2];
scanf("%d",&n);
while(n--)
{
int m;
scanf("%d",&m);
printf("%d\n",a[m]);
}
return 0;
}