变态跳台阶

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
 
思路:(重要是分析)
  本题前提是n个台阶,会有n阶的跳发,分析如下:
  f(1) = 1
  f(2) = f(2-1)+ f(2 -2)  //f(2-2)代表2阶台阶一次跳2阶的次数
  f(3) = f(3 -1) + f(3 -2) + f(3-3)
  ......
  f(n) = f(n-1) + f(n-2) + f(n - 3)+ .....+ f(n - (n-1)) + f(n-n)
  说明:
  1、这里的f(n)代表的是n个台阶有一次1,2,。。。。,n阶的跳法数
  2、n = 1时,只有一种跳发,f(1) = 1
  3、n = 2时,有两种跳发,一种1阶1阶跳,或者是直接跳2阶,f(2) = f(2 -1) + f(2 - 2)
  4、 n = 3时,会有三种跳发:1阶、2阶、3阶
    那么第一次跳出一阶后面剩下:f(3 - 1);第一次跳出2阶,剩下f(3 -2);第一次3阶,剩下f(3 -3)
    有结论:f(3) = f(3 -1) + f(3 -2) + f(3 - 3)
  5、n = n时,会有n种跳的方式,1,2,3,4,5,。。。。,n阶
    结论:f(n) = f(n - 1) + f(n - 2) + .....+ f(n - (n - 1) ) + f(n - n)
  6、由以上可得到另一种结论:
    f(n - 1) = f(0) + f(1) + f(2) + .....+ f((n -1) -1) = f(0) + f(1) +f(2) + ...... +f(n - 2)
    f(n ) = f(0) + f(2) + f(3) + ......+f(n - 2) + f(n - 1) = f(n - 1) + f(n - 1)
    ==>f(n) = 2 * f(n - 1)
  7、因此由此结论:
    n <= 0:  
        f(n) = 0;
    n == 1:
        f(n) = 1;
    n >= 2:
        f(n) = 2 * f(n - 1)
代码实现:
  递归:
复制代码
class Solution {
public:
    int jumpFloorII(int number) {
        if(number <= 0)
            return 0;
        if(number == 1)
            return 1;
        return 2 * jumpFloorII(number -1);
    }
};
复制代码
  动态规划:
复制代码
class Solution {
public:
    int jumpFloorII(int number) {
        if(number <= 0)
            return -1;
        if(number == 1)
            return 1;
        int sum = 1;
        
        for(int i = 2;i <= number;i++)
        {
            sum = 2 * sum;
        }
        return sum;
    }
};
复制代码

 

posted @   牛犁heart  阅读(215)  评论(0编辑  收藏  举报
编辑推荐:
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
阅读排行:
· 一个适用于 .NET 的开源整洁架构项目模板
· 【开源】C#上位机必备高效数据转换助手
· .NET 9.0 使用 Vulkan API 编写跨平台图形应用
· MyBatis中的 10 个宝藏技巧!
· [.NET] 使用客户端缓存提高API性能
点击右上角即可分享
微信分享提示