zoukankan      html  css  js  c++  java
  • 洛谷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所有题!

    客官,给个赞再走呗!

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

    个性签名:学习使我快乐

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

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

    赞助! 赞助! 赞助!

  • 相关阅读:
    Java可重入锁ReentrantLock
    Java异步编程
    机器学习 pipeline
    Python 机器学习 唐宇迪泰坦尼克号【最新代码】
    引用sklearn报错ImportError: cannot import name 'cross_validation'
    python机器学习-模型优化(六)
    python机器学习-模型评估(五)
    python机器学习-建模(四)
    python机器学习-特征工程(三)
    Python机器学习-数据预处理(二)
  • 原文地址:https://www.cnblogs.com/laoguantongxiegogo/p/12300841.html
Copyright © 2011-2022 走看看