2019独角兽企业重金招聘Python工程师标准>>>

例3:一共有10级,每次可走一步也可以走两步.必须要8步走完10级楼梯. 问:一共有多少种走法?

分析:走一步的需要6次,走两步的需要2次。因此,本题是6个1、2个2的组合问题。在6个一步中,插入2个两步的,因可放在第一个1步之前,也可以放在最后一个1步之后,所以6个1步有7个空.因此,如果两个两步在一起有c(7,1)种;如果两个两步的分开来插有C(7,2)种,因此共有c(7,1)+c(7,2)=7+21=28(种)=C(8,2)=C(8,6) 
    总数=8步中选2中走两步的=8步中选6个走一步的

Java编程实现:(数组迭代,动态规划,递归)

package com.test;

public classzoutaijie {

// 梯有N阶,上楼可以一步上一阶,也可以一次上二阶。编一个程序,计算共有多少种不同的走法。如果上20阶会有几种走法

public staticlongresult[]=new long[100];

public staticvoidmain(String[] args) {

result[0]=result[1]=1;

for(inti=2;i<</span>result.length;i++)

result[i]=-1;

//s不能太大,否则int溢出

int s =60;

//动态规划

long startTime = System.currentTimeMillis();

System.out.println("动态规划解决:"+fun1(s));

long endTime = System.currentTimeMillis();

System.out.println("动态规划解决-程序运行时间:"+(endTime-startTime)+"ms");

//数组叠加

long startTime2 = System.currentTimeMillis();

System.out.println("数组叠加实现:"+fun2(s));

long endTime2 = System.currentTimeMillis();

System.out.println("数组叠加实现-程序运行时间:"+(endTime2-startTime2)+"ms");

//递归方法

long startTime1 = System.currentTimeMillis();

System.out.println("递归方法解决:"+fun(s));

long endTime1 = System.currentTimeMillis();

System.out.println("递归方法解决-程序运行时间:"+(endTime1-startTime1)+"ms");

}

public staticlongfun(ints){

if(s==0 || s==1)

return 1;

else{

return fun(s-1)+fun(s-2);

}

}

public staticlongfun1(ints){

if(result[s]>=0) {

return result[s];

}else{

result[s]=(fun1(s-1)+fun1(s-2));

return result[s];

}

}

public staticlongfun2(ints){

long result_1[]=newlong[s+1];//注意这个要大一个,多了个第0个

result_1[0]=result_1[1]=1;

for(inti=2;i<=s;i++)

result_1[i]=result_1[i-1]+result_1[i-2];

return result_1[s];//s就是第s+1个

}

}

分析:

(1) int s=48时候的运行效果:

(2). int s=60时候的运行效果

显然数组叠加和动态规划效率高很多很多,不是一个数量级的!

/**

* 功能:有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。计算小孩上楼梯的方式有多少种。

*/

三种方法:

方法一:

//递归法/*** 思路:自上而下的方式。* 最后一步可能是从第n-1阶往上走1阶、从第n-2阶往上走2阶或从第n-3阶往上走3阶。* 因此,抵达最后一阶的走法,抵达这最后三阶的方式的综合。* @param n* @return*/public static int countWays(int n){if(n<0)return 0;else if(n==0)//注意此处条件return 1;else{return countWays(n-1)+countWays(n-2)+countWays(n-3);}}

方法二:

//动态规划/*** 思路:每次调用都会分支出三次调用。予以动态规划加以修正。* @param n* @param map* @return*/public static int countWaysDP(int n,int[] map){if(n<0)return 0;else if(n==0)return 1;else if(map[n]>-1)return map[n];else{map[n]=countWaysDP(n-1,map)+countWaysDP(n-2,map)+countWaysDP(n-3, map);return map[n];}}

方法三:

  1. package com.tian;
  2. import java.util.TreeMap;
  3. /**
  4. * 爬楼梯的算法(有一个人要爬楼梯,楼梯有N个台阶,此人最多可以爬M个台阶
  5. * 问这个人上楼有多少中上法)
  6. * @author Administrator
  7. *
  8. */
  9. public class Test {
  10. public static void main(String[] args) {
  11. System.out.println(new Test().suanfa(3,1));
  12. }
  13. /**
  14. * 得到所有能相加等于这个数的2个非自然正数
  15. * @param n
  16. */
  17. public void fenjie(final int n){
  18. for (int i = 1; i <=n; i++) {
  19. System.out.println(i+","+(n-i));
  20. }
  21. }
  22. /**
  23. *
  24. * @param n 总台阶数
  25. * @param m 最多能走的步数
  26. * @return 返回能走方法数
  27. */
  28. public int suanfa(final int n,final int m){
  29. switch (n) {
  30. case 1:
  31. return 1;
  32. case 2:
  33. if(m>=2){
  34. return 2;
  35. }
  36. else{
  37. return 1;
  38. }
  39. }
  40. int result=0;
  41. for (int i = 1; i <n; i++) {
  42. int a=i;
  43. int b=n-i;
  44. System.out.println(i+","+(n-i));
  45. result+=suanfa(a, m)*suanfa(b, m);
  46. }
  47. return result;
  48. }
  49. }

转载于:https://my.oschina.net/u/2822116/blog/791822

小孩上楼梯的方式的种类相关推荐

  1. 算法017:三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

    题目:三步问题.有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶.2阶或3阶.实现一种方法,计算小孩有多少种上楼梯的方式.结果可能很大,你需要对结果模1000000007.示例1:输入:n = ...

  2. 上楼梯(递归和迭代的对比)

    题目: 一个小孩上楼梯,楼梯有n阶,小孩每次可以上一阶,两阶或三阶,问一共有几种走法(约定n为0是方法数为1). 输入在一行给出n.答案对1e9^7取模. 输出在一行给出方法数. 思路: 这是一道很经 ...

  3. 面试经典算法-上楼梯问题

    上楼梯问题 [面试题]已知楼梯有20阶台阶,上楼可以一步上 1 阶,也可以一步上 2 阶,请编写一个函数计算一种有多少上楼梯的方式. #include "stdio.h" #inc ...

  4. 蓝桥杯实战应用【赛题解析篇】-小白上楼梯(递归设计)(附python、C++和Java代码)

    问题描述 小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶,3阶. 实现一个方法,计算小白有多少种上楼梯的方式. 输入输出 输出:台阶数量. 输出:多少种上楼梯的方式 例如:4阶楼梯 有7种方 ...

  5. 上楼梯(df和dp解法)

    题意: 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶.2阶.3阶. 请实现一个方法,计算小孩有多少种上楼的方式. 为了防止溢出,请将结果Mod 1000000007 给定一个正整数int n ...

  6. 【恋上数据结构】递归(函数调用过程、斐波那契数列、上楼梯、汉诺塔、递归转非递归、尾调用)

    递归(Recursion) 什么是递归? 函数的调用过程(栈空间) 函数的递归调用过程 递归实例分析(1 + 2 + 3 + ... + 100 的和) 递归的基本思想.使用套路 斐波那契数列 fib ...

  7. 算法题目:小白上楼梯

    2020.2.1312:00 补充一下几种排序的复杂度: 注:算法的稳定性:指的不是算法的时间复杂度不稳定如果在排序之前a在b的前面(a=b时),排序完以后,a跑到b的后面,那么称这个算法不稳定. 排 ...

  8. 蓝桥杯学习——递归问题(上楼梯)

    小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶,3阶,实现一个方法,计算小白有多少种走完楼梯的方式. 思路: 假设楼梯为1阶,小白有1种方式走完楼梯 假设楼梯为2阶,小白有2钟方式走完楼梯 ...

  9. 小白上楼梯(递归设计)

    import java.util.Scanner; /*** 小白上楼梯(递归设计)* @author 田秀彪* 小白正在上楼梯,楼梯有n阶台阶,小白一次可以上一阶,两阶或三阶,* 实现一个方法,计算 ...

最新文章

  1. CynosDB技术详解——存储集群管理
  2. mysql 索引分析工具_Mysql:性能分析以及Explain工具的使用
  3. tomcat 在eclipse中可以启动,独立不能启动
  4. 15款13英寸低配mbp的外接显示器选择
  5. 计算机total函数,以一敌十的SUBTOTAL函数,你不会用就太可惜了!
  6. ArcGIS教程 - 9 矢量数据空间分析
  7. 如何利用信息差来创造价值?
  8. Ubuntu16.04安装网易云音乐后打不开
  9. 【bzoj4200】【NOI2015】【小园丁与老司机】【dp+最小流】
  10. 用命令提示符打开MySQL并编译sql语句
  11. LSD计算机控制人体大脑,科学家发现了LSD对大脑的影响
  12. C++求球的面积与体积,公式一样输出结果不一样?
  13. Arduino Leonardo教程:如何回车,特殊按键定义,DIY超便宜的键盘主控
  14. 计算机名打印机无法共享,打印机共享不了怎么回事 打印机共享不了原因和解决办法【详解】...
  15. 批量识别PDF/OFD/PNG/JPG电子发票到EXCEL
  16. login-shell和non login-shell区别 & bash配置文件实验报告
  17. 米的换算单位和公式_Excel 怎样进行单位换算,excle怎么把米换算公里
  18. 数据库——《对数据进行排序》
  19. 基站网口损坏检查方法
  20. 【智能材料】用人工智能发现新型材料,金属玻璃可替代钢材

热门文章

  1. 「诗人艺术家ll著名诗人」胭脂茉莉十四行诗10首
  2. 【故障检测】基于 KPCA 的故障检测(Matlab代码实现)
  3. visio2013都提示“正在配置请稍后”
  4. 开源企业内部文档共享平台(mm-wiki)
  5. matplotlib函数库使用imshow绘制像素图片
  6. uniapp文档常用整理
  7. 分析武汉二手房房价信息
  8. 送什么礼物给小学生比较有纪念意义?适合送小学生的小礼物
  9. 移动App该怎样保存用户password
  10. 做个火影般的架构师,阿里内网疯狂传阅的“M8级”分布式架构笔记