美文网首页
台阶问题(动态规划算法)

台阶问题(动态规划算法)

作者: sjyu_eadd | 来源:发表于2021-07-01 13:21 被阅读0次

问题描述:

有个高度为10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要到达最上面问一共有多少种走法?

问题分析:

解法一:穷举法(该方法往往不是最有效,但往往是最直接的解决问题的方法)

解法二:动态规划法

目标要想找到到达从0阶到10阶,那么最后的一步要么是从第8阶到第10阶,要么是从第9阶到第10阶,于是将问题转化为两部分之和:

(1) 从0阶到第8阶的方法

(2) 从0阶到第9阶的方法

我们可以用公式表达为F(0,10)= F(0,9)+ F(0,8)

F(0,N)表示从0阶到第N阶的方法

同样道理:F(0,9) = F(0,8)+ F(0,7)

于是存在如下递推关系:

F(0,N) = F(0,N-1)+ F(0,N-2) (N > 2)

F(0,1)= 1

F(0,2)= 2

这和斐波那契数列的递推关系是类似的,于是代码实现如下(python语言):

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
def compute1(N):
    '''
    递归实现
    :param N: 第N阶台阶
    :return:
    '''
    if N<= 0:
        return "parameter invalid."
    elif N == 1:
        return 1
    elif N == 2:
        return 2
    else:
        return compute1(N- 1) + compute1(N - 2)
 
def compute2(N):
    '''
    非递归实现
    :param N: 第N阶台阶
    :return: c 从第0阶到第N阶总的方法
    '''
    if N <= 0:
        return "parameter invalid."
    elif N == 1:
        return 1
    elif N == 2:
        return 2
    else:
        a, b, c = 1, 2, 0
        while N >2:
            c = a + b
            a, b = b, c
            N -= 1
        return c
 
if __name__ == "__main__":
    print compute1(-5)
    print compute2(5)

上面思考问题是从最后一步有几种方法的角度入手
那么如果从第一步有几种方法的角度入手是不是也有相似的递推关系呢?我们来分析下:

第一步存在两种方法:(1)一个台阶,还剩 9个(2)2个台阶,还剩8个

那么从第0阶到第10阶的方法 = 剩余9个台阶的方法(从第1阶到第10阶的方法) + 剩余8个台阶的方法(从第2阶到第10阶的方法)

我们用公式表示为:

G(0,10) = G(1,10) + G(2,10)

G(N,10)表示从第N阶到第10阶的方法数。

同样:

G(1,10) = G(2,10) + G(3,10)

G(2,10) = G(3,10) + G(4,10)

于是存在如下递推关系:

G(N,10) = G(N + 1,10) + G(N + 2,10) (N + 2 <= 9)

G(8,10) = 2

G(9,10) = 1

代码实现如下(python语言):

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
def compute1(N, M):
    '''
    递归实现
    :param N: 第N阶台阶
    :param M: 总的台阶数
    :return:
    '''
    if  N < 0 or N >= M:
        return "parameter invalid."
    elif N == M- 1 :
        return 1
    elif N == M- 2:
        return 2
    else:
        return compute1(N+ 1, M) + compute1(N + 2, M)
 
def compute2(N, M):
    '''
    非递归实现
    :param N: 第N阶台阶
    :param M: 总的台阶数
    :return:
    '''
    if  N < 0 or N >= M:
        return "parameter invalid."
    elif N == M- 1 :
        return 1
    elif N == M- 2:
        return 2
    else:
        a, b, c = 1, 2, 0
        while N <M - 2:
            c = a + b
            a, b = b, c
            N += 1
        return c
 
if __name__ == "__main__":
    print compute1(0, 5)
    print compute2(0, 5)

上述两种方法分别称为前向动态规划方法(顺序解法)和后向动态规划方法(逆序解法)。

相关文章

  • 台阶问题(动态规划算法)

    问题描述: 有个高度为10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要到达最上面问一共有多少种走...

  • 维特比算法

    维特比(Viterbi)算法是一种动态规划算法,在处理隐马尔可夫(HMM)最优路径问题时经常被使用. 动态规划算法...

  • 动态规划算法(01背包问题)

    一. 动态规划算法介绍: 动态规划算法和分治算法类似,也是将待求解问题分成若干个小问题一步步求解,不同的是,每一个...

  • 【JS算法】动态规划 - 斐波那契数列

    动态规划算法 动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法。其基本思想也...

  • 背包问题

    介绍 学习动态规划算法的经典例题。动态规划算法一般有3个特征1、最优化原理:最优解所包含的子问题的解也是最优的。2...

  • 简单台阶问题

    1、一只青蛙一次可以跳上一级台阶,也可以跳上两级台阶,求该青蛙跳上一个n级台阶总共有多少种跳法?思路:假设n的函数...

  • 跳台阶问题

    跳台阶问题 题目描述: 一个台阶总共有 n 级,如果一次可以跳 1 级,也可以跳 2 级。求总共有多少种跳法,并分...

  • 跳台阶问题

    最近在刷一些数据结构的题,发现个很有趣的问题:跳台阶问题。 1. 第一题(引子):输出菲波那切数列的第N项。 斐波...

  • 台阶积水问题

    数组中的每一个元素相当于一个台阶,假使水量足够大,那么台阶上的积水有多少,例如数组[0,1,0,1,2,1,0,1...

  • 动态规划算法之解决背包问题

    动态规划算法介绍 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决...

网友评论

      本文标题:台阶问题(动态规划算法)

      本文链接:https://www.haomeiwen.com/subject/qeujultx.html