文档章节

小孩上楼梯的方式的种类

一贱书生
 一贱书生
发布于 2016/11/22 09:34
字数 984
阅读 13
收藏 0

梯有N阶,上楼可以一步上一阶,也可以一次上二阶(Java实现)
 

例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时候的运行效果:

 

 梯有N阶,上楼可以一步上一阶,也可以一次上二阶(Java实现)


 

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

 

 梯有N阶,上楼可以一步上一阶,也可以一次上二阶(Java实现)

 

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

 

 

/**

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

© 著作权归作者所有

共有 人打赏支持
一贱书生
粉丝 19
博文 724
码字总数 600123
作品 0
重磅!优必选CES推出双足机器人Walker,准备卖给全球高端消费人群

     CES 2018优必选展位   美国时间2018年1月9日,国际消费类电子产品展览会(简称CES)在拉斯维加斯开幕。优必选作为全球领先的人工智能和人形机器人研发、制造和销售为一体的高科技...

人工智能机器人联盟
01/10
0
0
你对爱人的态度,决定了你的婚姻质量

01 在好友大妮家做客时,她老公刚购物回来,气呼呼地拎着大包小包爬楼梯上来。 东西刚放下,大妮在房间里叫他,“老头,赶紧拿片纸尿裤来”。 大妮她老公一听立马拿了尿裤进房间去,那动作干...

洪生鹏
06/14
0
0
Jzoj3528 图书馆

圣玛格丽特大图书馆是一座由石材砌成的角柱型高塔,是欧洲屈指可数的巨大书库。图书馆整面墙壁都是巨大的书架,书架与书架之间就像巨大的迷宫一般,以细窄的木制楼梯连结。大图书馆的最高处是...

JacaJava
01/22
0
0
codevs4438 YJQ Runs Upstairs

Description 学校科技楼一共有 层,而神犇YJQ每天都在科技楼 楼的机房写代码。这天,他准备从科技楼 楼爬到 楼。有个 连接不同楼层的楼梯,爬每个楼梯需要一定的体力值。楼梯一定是从低处通往高...

aziint
01/06
0
0
DONI智能扫地机器人有哪些功能 智能扫地机器人功能介绍

  进入21世纪,中国的科技的不断进步给我们的生活带来了越来越多的惊喜,神舟飞船上天、载人空间站、月地卫星、民用大飞机、国产航母……高科技、智能时代已经来临。其中之一的智能扫地机器...

DONI扫地机
08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
4
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
121
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
4
0
我为什么用GO语言来做区块链?

Go语言现在常常被用来做去中心化系统(decentralised system)。其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地。 我们在决定做Karachain的时候,考量(b...

HiBlock
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部