小孩上樓梯的方式的種類

梯有N階,上樓能夠一步上一階,也能夠一次上二階(Java實現)
 

例3:一共有10級,每次可走一步也能夠走兩步.必需要8步走完10級樓梯. 問:一共有多少種走法?html

分析:走一步的須要6次,走兩步的須要2次。所以,本題是6個一、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編程實現:(數組迭代,動態規劃,遞歸)java

package com.test;算法

public classzoutaijie {編程

// 梯有N階,上樓能夠一步上一階,也能夠一次上二階。編一個程序,計算共有多少種不一樣的走法。若是上20階會有幾種走法數組

public staticlongresult[]=new long[100];url

public staticvoidmain(String[] args) {spa

result[0]=result[1]=1;.net

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

result[i]=-1;blog

//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. }
相關文章
相關標籤/搜索