码迷,mamicode.com
首页 > 编程语言 > 详细

【核心算法7】动态规划算法

时间:2020-06-22 22:44:25      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:动态   阶段   一个   code   通过   划算   初始   就是   直接   

动态规划算法将待求解问题拆分成一系列相互交叠的子问题,通过递推关系定义各子问题的求解策略,并随时记录子问题的解,最终获得原始问题的解,避免了对交叠子问题的重复求解。

在动态规划算法中有三要素:

  1. 最优子结构: 是指每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到
  2. 边界: 是指问题最小子集的解
  3. 状态转移函数: 是指从一个阶段向另一个阶段过渡的具体模式,描述的是两个相邻子问题之间的关系
  • 爬楼梯问题
  • 矿工挖矿问题
  • 背包问题
  • 最长递归子序列问题

爬楼梯问题

问题描述

现有一个10层台阶的楼梯,每次可以选择一步走一级台阶或者一步走两级台阶,请计算共有多少种走法。

解题思路:

  1. 首先考虑最后一步的情况,要么是从第九级台阶再走一级到第十级,要么是从第八级台阶走两级到第十级,也就是说,要想到达第十级台阶,最后一步一定是从第八级或者第九级台阶开始的

  2. 如果已知从地面到第八级台阶一共有X种走法,从地面到第九级台阶一共有Y中走法,则从地面走到第十级台阶一定是X+Y

  3. 假设用F(n) 表示第n级台阶的走法数量,根据以上分析,可以得到 F(10) = F(9) +F(8),推广而知,

    ? F(n) = F(n-1) + F(n-2)

  4. 当问题细化,只有一级和两级台阶时,可以直接得出结论。

  5. 所以,该问题作为动态规划问题求解的三个要素就全部出现了

    边界:F(1)=1, F(2)=2
    最优子结构: F(n)的最优子结构为F(n-1)和F(n-2)
    状态转移函数: F(n)=F(n-1)+F(n-2)
    

代码实现

def upstairs(n):
    # 初始化边界值
    step1 = 1
    step2 = 2
    temp = 0
    # 判断当前台阶级数是否小于1
    if n < step1:
        print(0)
    # 判断当前台阶级数是否为1
    if n == step1:
        print(1)
    # 判断当前台阶级数是否为2
    if n == step2:
        print(2)
    # 迭代求解各级台阶的走法数量
    for i in range(3, n):
        temp = step1 + step2
        step1 = step2
        step2 = temp
    print(temp)

n = 10
upstairs(10)

【核心算法7】动态规划算法

标签:动态   阶段   一个   code   通过   划算   初始   就是   直接   

原文地址:https://www.cnblogs.com/JoshuaP/p/13179405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!