热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

动态规划应用:解决楼梯攀爬问题——初探

楼梯攀爬问题的初步探讨本文介绍了动态规划在解决楼梯攀爬问题中的应用。动态规划的核心在于将复杂问题分解为若干重叠的子问题,并通过存储这些子问题的解来避免重复计算,从而提高求解效率。文章详细阐述了如何利用动态规划的思想,逐步构建解决方案,并通过具体实例展示了该方法的有效性和优越性。
走楼梯问题

动态规划简介:


  • 动态规划

    • 动态规划的核心思想:就是将求解问题分解成多个相互交叠的子问题进行求解,每次求解小型子问题的同时记录计算结果(相当于一个备忘录),在求解较大型子问题的时候会依赖于小型子问题的计算结果,避免重复计算。
    • 子问题:子问题的意思就是相对于求解问题来说仅仅是计算的规模变小了,解决问题的目标和思路都没有改变。(例如:二分查找每次将数组分为两部分,每一部分的查找就可以看做是一个子问题)
    • 相互交叠的子问题:相互交叠的意思就是大型子问题会包含小型子问题的求解。也就是说求解大型子问题的时候会用到小型子问题求解的计算结果。
  • 动态规划三要素:最优子结构,边界,状态转移函数

    • 最优子结构:其实就是子问题的求解的结果一定是要最优的,每个阶段的最优状态可以由之前的某个阶段的状态得到或者直接得到
    • 边界:指最小子问题的解,在代码中就是递归的出口或者是备忘录的初始值
    • 状态转移函数:指从一个状态转移到另一个状态的具体模式,其实也就是两个(多个)相邻子问题之间的关系

问题描述:


  • 假设小明要走一个n级的楼梯,一步走一级或者一步走两级,问他走到顶有多少种方法。
  • 举个例子,他可以每次走一步,那么他走了10步;他也可以一次走两步,他走了5步;解题的人要找到所有走的方案。

解题思路:


  • 假设 n = 10
  • 如果我们从第一步开始看,第一步可能走一级或者两级,第二步也可能会走一级或者两级,这样不断的去计算会显得非常复杂,那么我们不妨从后往前看。
  • 现在假设已经走到了最后一步,小明只需要跨一步就可以走到第十级,那么此时小明可能站在第八级的上面或者站在第九级的上面
  • 那么如果我们已经知道走到第八级有X种走法,走到第九级有Y种走法,则走到第十级的走法就是X + Y
  • 设F(n)为走到n级的走法数,那么F(10) = F(8) + F(9),那么推广到一般的情况就是F(n)= F(n-1)+ F(n -2)
  • 此时动态规划的三要素就全部出现了:
    • 状态转移方程:F(n)= F(n-1)+ F(n -2)
    • 边界就是最小子问题:即F(1) = 1, F(2) = 2
    • 最优子结构:F(n-1), F(n -2)

注意:这一题其实是非常简单的一道题目,实际上并没有用到备忘录的设计,但是主要的思想其实就是划分相互交叠的子问题,记录计算结果,进行状态转移

具体实现:

public static int runSteps(int n){if(n < 0) return 0;if(n &#61;&#61; 1) return 1;if(n &#61;&#61; 2) return 2;return runSteps(n-1) &#43; runSteps(n-2);}


推荐阅读
author-avatar
Life一切安好
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有