
动态规划
Mr.郑先生_
越是不可能,越要创造无限可能
展开
-
动态规划的HelloWorld——基于Python求解0-1背包问题
0-1背包问题前言0-1背包问题问题描述示例问题分析状态转移方程1. 确定初始化状态2. 确定状态参数3. 确定决策过程编写代码进行求解0-1 背包问题的延伸最后一块石头的重量问题描述示例问题分析转换成动态规划问题写出状态转移方程通用的动态规划公式的理解总结与升华前言提起动态规划,大部分人最先想到的就是背包问题。事实上,背包问题分很多种,大多数人首先遇到的一般是背包中的 0-1 背包问题。因此,这个问题称作动态规划问题的HelloWorld。0-1背包问题很经典,又极具代表性,能很好地展示动态规划思想原创 2020-10-10 22:12:32 · 837 阅读 · 0 评论 -
使用动态规划求解算法问题的五大特点总结(附基于Python的参考代码)
什么样的问题应使用动态规划求解前言一、求“最”优解问题(最大值和最小值)1. 乘积最大子数组问题描述示例题目分析参考代码2. 最长回文子串问题描述示例题目分析参考代码3. 最长上升子序列问题描述示例题目分析参考代码二、求可行性(True 或 False)1. 凑零兑换问题问题描述示例题目分析参考代码2. 字符串交错组成问题问题描述示例题目分析参考代码三、求方案总数1. 硬币组合问题问题描述示例题目分析参考代码2. 路径规划问题问题描述示例题目分析参考代码四、数据不可排序1. 最小的 k 个数问题描述示例题目原创 2020-10-07 06:54:38 · 2996 阅读 · 0 评论 -
使用动态规划完美解决硬币找零问题(Python)
使用动态规划解决硬币找零问题前情提要动态规划的问题描述重叠子问题无后效性最优子结构互相独立——满足最优子结构互相干扰——不满足最优子结构深入理解最优子结构使用动态规划求解硬币找零问题递归与动态规划状态缓存与循环通用的动态规划从贪心算法到动态规划总结与升华前情提要在前面几篇文章中,我们使用了贪心算法求解硬币找零的问题,并从中发现了贪心算法本身的局限性:贪心算法几乎只考虑了局部最优,因此无法应对需要考虑整体最优的算法问题。针对这一问题,我们重新思考了解决方案,用递归的方法来穷举出所有可能的组合,从这原创 2020-10-06 17:19:09 · 7712 阅读 · 0 评论 -
解决递归中的重复计算问题——保存临时的中间结果
避免在递归中重复计算前情提要重叠子问题使用备忘录解决重复计算重叠子问题处理模式重叠子问题的限制方案弊端总结与升华前情提要在上一篇文章(从贪心算法到暴力递归法——从局部最优到整体最优),我们提到了最优解问题,在考虑整体最优的情况下,需要找到一种办法获取最优解。那么最简单直接的做法其实就是把所有可行的答案穷举出来,然后在所有可行的答案中找出满足条件的最值。这样的解法看似“天衣无缝”,但它有着重要的缺陷——执行效率极低。导致这个问题的罪魁祸首是重叠子问题,那么应该如何解决重叠子问题并提高算法效率呢?重叠原创 2020-10-05 17:57:43 · 2475 阅读 · 0 评论 -
从贪心算法到暴力递归法——从局部最优到整体最优
从递归看动态规划前情提要最优问题的本质目标函数最优组合的求解策略枚举递归斐波那契数列问题描述示例解题思路迭代递归深入理解递归堆栈与递归的状态存储递归与回溯树形结构与深度优先搜索暴力递归的问题性能问题可读性与调试问题暴力递归的优化——剪枝从整个搜索策略上来调整从解空间图的角度做调整总结与升华前情提要在上一篇文章(从贪心算法开始认识动态规划——硬币找零问题)里,我们已经学习了贪心算法的思想,并且发现贪心算法是一种使用局部最优思想解题的算法,即从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的速度去求得原创 2020-10-04 22:44:39 · 3961 阅读 · 0 评论 -
从贪心算法开始认识动态规划——硬币找零问题
从贪心算法初识动态规划什么是动态规划硬币找零问题问题描述示例题目分析贪心算法贪心算法的基本思路回到硬币找零问题贪心算法的局限性总结与升华什么是动态规划动态规划是一种通过“大而化小”的思路解决问题的算法。区别于一些固定形式的算法,如二分法,宽度优先搜索法,动态规划没有实际的步骤来规定第一步做什么第二步做什么。所以更加确切的说,动态规划是一种解决问题的思想。这种思想的本质是,将一个规模比较大的问题,通过规模比较小的若干问题的结果来得到的。从另一方面来说,计算机是很笨的,我们最开始都是通过穷举法来解决问题原创 2020-10-03 15:02:30 · 8353 阅读 · 0 评论