洛谷P1225 数楼梯

题目描述

楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。

输入格式

一个数字,楼梯数。

输出格式

走的方式几种。

输入输出样例

输入:
4
输出:
5

说明/提示

60% N<=50
100% N<=5000)


下面正式进入这道题的题解

我今天写了两篇题解(都很水)
这道题的话似乎有很多种方法,只是我见过的就好几种
这里就像大家推荐两种方法喽。
第一种解法
第一种解法是根据题意直接递归(推)(个人感觉是一种了)
我们想一下,走楼梯,要么一次走一格,要么一次走两格,那我每次的走法就等于=上一格的方案数+上上格的方案数咯,这就推出了方程:
f[n]=f[n-1]+f[n-2]
OK结束啦。
但是要注意走到第n-1阶的时候就不能再迈两阶了。
这里就展示一种递归的解法:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #define inf 100000000
 7 using namespace std;
 8 int ans,n,a;
 9 int dg(int x)
10 {
11     if(x<=0)
12         return 1;
13     if(x-2>=0)
14         return dg(x-2)+dg(x-1);
15     else
16         return dg(x-1);
17 }
18 int main()
19 {
20     cin>>a;
21     ans=dg(a);
22     cout<<ans<<" ";
23 }

第二种解法

同学们把代码提交上去之后就会发现会t掉或者wa(递归会t递推没试过)

wa的原因是因为数据大,需要高精度

tle因为递归的时间太长,数据太大。所以不可行(其实不是,在每一次计算出第x阶是记录下来方案数,下次直接用就可以,这里不写了)

所以就要想起其他方法:

高精加+斐波那契数列(一种正解)

为什么会得出这个结论(我当时是打表找规律)

其实大家看斐波那契数列的公式:f(n)=f(n-1)+f(n-2)

和这道题一样的!

所以直接这么办就好(二维数组要用上)

高精不会写?这里不教。。。。。。

上代码!

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #define inf 100000000
 7 using namespace std;
 8 int n,len=1,a[5010][5010];
 9 int p(int j)
10 {
11     for(int i=1;i<=len;i++)
12         a[j][i]=a[j-1][i]+a[j-2][i];
13     for(int i=1;i<=len;i++)
14     {
15         if(a[j][i]>=10)
16         {
17             a[j][i+1]+=a[j][i]/10;
18             a[j][i]=a[j][i]%10;
19             if(a[j][len+1]==1)
20                 len++;
21         }
22     }
23 }
24 int main()
25 {
26     cin>>n;
27     a[1][1]=1,a[2][1]=2;
28     for(int i=3;i<=n;i++)
29         p(i);
30     for(int i=len;i>=1;i--)
31         cout<<a[n][i];
32     return 0;
33 }

好了结束啦!

最后祝大家AC所有题!

客官,给个赞再走呗!

-------------------------------------------

个性签名:学习使我快乐

如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

博主最近五行缺钱,请求精准扶贫

赞助! 赞助! 赞助!

原文地址:https://www.cnblogs.com/laoguantongxiegogo/p/12300841.html