动态规划-楼梯问题

栏目: 编程工具 · 发布时间: 5年前

内容简介:有一楼梯共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)。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

即将到来的场景时代

即将到来的场景时代

罗伯特•斯考伯、谢尔•伊斯雷尔 / 赵乾坤 周宝曜 / 北京联合出版公司 / 2014-5-1 / 42

科技大神、全球科技创新领域最知名记者 罗伯特·斯考伯:“技术越了解你,就会为你提供越多好处!” 互联网的炒作点一个一个不停出现,大数据、3D打印、O2O等,无不宣扬要颠覆商业模式。但是,互联网进入移动时代,接下来到底会发生什么?移动互联网时代真正带来哪些改变?这具体会怎样影响我们每一个人的生活?商业真的会被颠覆?目前为止没有一本书给出答案。 《即将到来的场景时代》不是就一个炒作点大加谈......一起来看看 《即将到来的场景时代》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具