内容简介:有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?输入输出描述Input
1、问题描述
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
输入输出描述
Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
Output
对于每个测试实例,请输出不同走法的数量
示例:
Sample Input
2
2
3
Sample Output
1
2
2、思路分析
利用 动态规划(DP,dynamic programming) 思想,简单来说:大事化小小事化了
假设10级,考虑只差最后一步到10级,一步走1阶或2阶,只有两种可能:到9阶和到8阶。
如果到9阶的走法有X种,到8阶的走法有Y种,那么,总走法=X+Y。
即:F(10)=F(9)+F(8)
同理,F(9)=F(8)+F(7),F(8)=F(7)+F(6),这样问题可以从10阶到 [9和8] 阶,再到 [9和8] 拆开的阶,这样往下,分阶段将问题简化。
寻找基准或者初始解:当为F(2)和F(1)时,前者有两种走法(1+1,2),后者有一种走法(1)。
即:①F(2)=2,F(1)=1。再加上②F(10)=F(9)+F(8),
得到三个动态规划的概念:
【 最优子结构 】:F(9)和F(8),是F(10)的最优子结构
【 边界 】:F(1)和F(2)是问题的边界,无法再简化/拆解
【 状态转移方程 】:F(10)=F(9)+F(8),上下阶段的关系
递归公式: F(n)=F(n-1)+F(n-2) ,实为斐波那契数列的递归公式。
3、程序实现
首先用递归进行实现,与动态规划做比较。前者代码简洁,但执行效率不如后者。
1)递归
int getWays(int n){
if(n<1) return 0;
if(n==1) return 1;
if(n==2) return 2;
return getWays(n-1)+getWays(n-2)
}
2)动态规划
从底到上推导:
F(1)=1,F(2)=2,
F(3)=F(2)+F(1)=1+2
F(4)=F(3)+F(2)=3+2
每次迭代,只保留之前的两个状态,即可推导新的状态。
源程序:
import java.util.Scanner;
/**
* Input:输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
* Output:对于每个测试实例,请输出不同走法的数量
*/
public class DPSumsung {
public static int getWays(int n) {
if(n<1) return 0;
if(n==1) return 1;
if(n==2) return 2;
int a=1;
int b=2;
int next=0;
for(int i=3;i<=n;i++) {
next=a+b;
a=b;
b=next;
}
return next;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int count=sc.nextInt();
int[] ways=new int[count];
int i=0;
int n=sc.nextInt();
while(n>=1&&n<=40) {
ways[i++]=DPSumsung.getWays(n);
if(i>=count)
break;
n=sc.nextInt();
}
for(int temp:ways) {
System.out.println(temp);
}
sc.close();
}
}
4、算法分析
时间复杂度为O(N),空间复杂度为O(1)。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- LeetCode70 —— 爬楼梯
- LeetCode - 070 - 爬楼梯(climbing-stairs)
- 每日一道算法题--leetcode 746--使用最小花费爬楼梯--python
- Java学习路线规划
- 算法-动态规划
- 聊聊动态规划(2) -- 特征
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JAVA 2核心技术 卷Ⅰ
[美] 霍斯特曼、[美] 科奈尔 / 叶乃文、邝劲筠 等 / 机械工业出版社 / 2006-5 / 88.00元
本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java2开发平台标准版J2SE5.0的基础知识,主要内容包括面各对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing UI工具箱进行图形用户界面设计,异常处理、流输入/输出和对象序列化、泛型程序设计等。 本书内容翔实、深入浅出,附有大量程序实例,极具实用价值,是Java初学者和Java程序员......一起来看看 《JAVA 2核心技术 卷Ⅰ》 这本书的介绍吧!
图片转BASE64编码
在线图片转Base64编码工具
XML 在线格式化
在线 XML 格式化压缩工具