来源:JK老班

题目:n阶楼梯,每次跳1 或 3 或 4阶,问有几种跳法?


1.递归:

#include<iostream>
using namespace std;
int count=0;//调用次数
int F(int i){
    count++;
    if(i==0) return 1;
    int sum=0;
    if(i>=1) sum+=F(i-1);
    if(i>=3) sum+=F(i-3);
    if(i>=4) sum+=F(i-4);
    return sum;
}

int main(){
    int n=20;
    cout<<F(n)<<endl;
    cout<<"count="<<count;
}

大量重复计算。


可以将算过的返回加起来,避免重复计算。

2.递归优化:

#include<iostream>
using namespace std;
int count=0;//调用次数
int A[100]={0};

int F(int i){
    count++;
    if(A[i]!=0) return A[i];
    if(i==0) return 1;
    int sum=0;
    if(i>=1) sum+=F(i-1);
    if(i>=3) sum+=F(i-3);
    if(i>=4) sum+=F(i-4);
    A[i]=sum;
    return sum;
}

int main(){
    int n=20;
    cout<<F(n)<<endl;
    cout<<"count="<<count;
}

查看实际计算次数:

#include<iostream>
using namespace std;
int count=0;
int A[100]={0};

int F(int i){
    if(A[i]!=0) return A[i];
    if(i==0) return 1;
    count++;
    int sum=0;
    if(i>=1) sum+=F(i-1);
    if(i>=3) sum+=F(i-3);
    if(i>=4) sum+=F(i-4);
    A[i]=sum;
    return sum;
}

int main(){
    int n=20;
    cout<<F(n)<<endl;
    cout<<"count="<<count;
}

楼梯阶数多时,递归调用次数还是很多的。


3.动态规划:

#include<iostream>
using namespace std;
int count=0;
int A[100]={0};

int main(){
    int n=40; A[0]=1;
    for(int i=1;i<=n;i++){
        A[i]=A[i-1];
        if(i>=3) A[i]+=A[i-3];
        if(i>=4) A[i]+=A[i-4];
    }
    cout<<A[n];
}

跳楼梯--递归--动态规划--过渡相关推荐

  1. C语言:跳楼梯问题(斐波那契数列)(vs)(递归)

    一,问题: 小只因跳楼梯: 众所周知美国校队只因一次可以跳上1级台阶,也可以跳上2级.求该只因跳上一个n级的台阶总共有多少种跳法? 二,思路: /*从逆向想: x层的走法其实就是其前一层或前两层的走法 ...

  2. 剑指offer-跳楼梯和变态跳楼梯(C++)

    1.普通跳楼梯 1.题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 2.解题思路 该题本质上是斐波那契数列,从第n阶台 ...

  3. 3-3 兔子跳楼梯 3-4 斐波那契数列(II)

    3-3 兔子跳楼梯 小兔子喜欢蹦蹦跳跳上楼梯 ,它能一次跳1阶楼梯,也能一次跳上2阶楼梯.问小兔子要上一个n阶的楼梯,最多有多少种不同上楼的走法? 输入格式: 输入一行包含一个整数 n,表示有几阶楼梯 ...

  4. 算法—斐波拉契数列(跳楼梯问题)

    问题描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 这道题一看,就会轻易的知道用递归,f(1)=1;f(2)=1;f(n)=f(n-1)+f(n-2 ...

  5. 剑指offer 青蛙跳楼梯

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法.(变态跳楼梯) 解题思路 1.数学归纳 因为n级台阶,第一步有n种跳法:跳1级. ...

  6. 买卖股票最佳时机+青蛙跳楼梯

    1.买卖股票最佳时机 数组 numbers: [1,2,6,3,4] 想求的最佳买卖时机,暴力解法,可以使用for循环,循环两次,查看最大差值 较优方案:动态规划 初始化一个Min值和一个Max值,m ...

  7. [Leetcode][第546题][JAVA][移除盒子][递归][动态规划]

    [问题描述][困难] [解答思路] 1. 递归 动态规划 class Solution {public int removeBoxes(int[] boxes) {int[][][] dp = new ...

  8. 蓝桥杯练习 小明上楼梯(递归设计)

    小白上楼梯(递归设计) 题目 思路 源代码 题目 小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方法. 思路 可以发现,这道题就跟求斐波那契 ...

  9. 跳楼梯(洛谷P1255题题解,Java语言描述)

    题目要求 题目链接 分析 一个经典问题,跳楼梯问题,考察最最最简单的DP. 从当前阶梯看,可以向上跳1格或是2格(前提是受到顶部约束):倒过来看,从起点到达当前阶梯的可能路径数是从起点到当前阶梯-1和 ...

最新文章

  1. c++ resizereserve
  2. Android自动化测试框架
  3. spring中那些让你爱不释手的代码技巧
  4. zookeeperclient设置监听
  5. VS2005的Command Window 调试命令的总结(转载)
  6. nyoj--86--找球号(一)(hashset二分)
  7. oracle sh文件怎么打开,Oracle数据库逻辑备份的SH文件
  8. iOS使用新浪微博、微信官方SDK分享内容
  9. pip/pip3 install 报错 “Could not find a version that satisfies the requriement xxx” 的解决方法
  10. postman 配置统一的ip地址
  11. 电子计算机印前技术定义,印前技术入门教程 -电脑资料
  12. 终于搞定电子专利网上申请了
  13. R语言使用dplyr包计算dataframe分组聚合样本独特值个数、计数个数、四分位距IQR
  14. 好用的识别植物的软件app合集分享,快码住了
  15. Java各种运算符号的含义及区别汇总
  16. Java基础案例:查找水仙花数(for循环)详解
  17. TB5 AXD 在win7 vista下 启动失败
  18. HTML-背景和图片
  19. 【React-Native】集成微信官方安卓端SDK,实现微信登录、发送/分享小程序消息等功能
  20. 雪山温泉海螺沟(一) 成都

热门文章

  1. Java jbcl.jar下载
  2. CDZ8100 Linux32 系统,UbuntuLinux的操作系统基本.ppt
  3. 引领腕上健康潮流:华米科技再推时尚智能手表新品
  4. U盘安装ubuntu20.04 Linux系统分区方案 Invalid Partition Table
  5. KDYD-JC自动高压漆膜连续性试验仪
  6. Python爬虫HTTP异常:rllib.error.HTTPError: HTTP Error 418,伪装User-Agent以及fake-useragent插件的妙用
  7. 李开复解密微软成功之道 盖茨鲍尔默好搭档(zz)
  8. 带你打造一套 APM 监控系统 之 卡顿监控
  9. 史上最全 69 道 Spring 面试题和答案
  10. Cadence PSpice 模型10:ABM库的控制源型模型介绍与使用方法图文演示