zoukankan      html  css  js  c++  java
  • 跳台阶问题

    给定一个有N个台阶的楼梯,一个人从下到上开始跳台阶,这个人有两种跳的方式:一次跳一个台阶,一次跳两个台阶;

    问:从台阶底端跳到台阶顶端,有多少种跳台阶的方式?

    解法一:递归法

    分析:

    首先我们考虑最简单的情况。如果只有1个台阶,那么显然只有一种跳法;如果是2级台阶,那么有2种跳法。对于一个有n级台阶的楼梯来说,我们设跳法为 f(n) ,假如我们先跳1个台阶,则剩下有 n-1 个台阶,跳法为 f(n-1) 次,假如我们先跳2个台阶,则剩下 n-2 阶,跳法为 f(n-2);由此可以推出,对于一个n阶的楼梯,有以下这个跳台阶的公式:

    long long Fibonacci(unsigned int n)
    {
        if(n==1)
            return 1;
        if(n==2)
            return 2;
        return Fibonacci(n-2)+Fibonacci(n-1);
    }

     解法二:递推法(使用递归法有很多重复计算,事实上我们可以从后往前推,一步步利用之前计算的结果递推,初始化时a=b=1,然后递推计算最后,b的值为最后的值)

    long long Fibonacci1(unsigned int n)
    {
        if(n<2)
            return 1;
        int a=1,b=1;
        int temp;
        for(int i=2;i<=n;i++)
        {
            temp=a+b;
            a=b;
            b=temp;
        }
        return b;
    }

    更清楚代码为:

    long long Fibonacci1(unsigned int n)
    {
        if(n<2)
            return 1;
        int dp[3]={1,1};
        for(int i=2;i<=n;i++)
        {
            dp[2]=dp[0]+dp[1];
            dp[0]=dp[1];
            dp[1]=dp[2];
        }
        return dp[2];
    }
  • 相关阅读:
    bzoj1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
    bzoj1016: [JSOI2008]最小生成树计数
    bzoj1051: [HAOI2006]受欢迎的牛
    bzoj1003: [ZJOI2006]物流运输
    bzoj1079: [SCOI2008]着色方案
    bzoj1179: [Apio2009]Atm
    bzoj1877: [SDOI2009]晨跑
    bzoj1821: [JSOI2010]Group 部落划分 Group
    bzoj1305: [CQOI2009]dance跳舞
    bzoj1858: [Scoi2010]序列操作
  • 原文地址:https://www.cnblogs.com/wft1990/p/7061358.html
Copyright © 2011-2022 走看看