| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 动态规划DynamicPrograming解题套路总结 -> 正文阅读 |
|
[数据结构与算法]动态规划DynamicPrograming解题套路总结 |
????????动态规划问题应该是很多人比较头疼的,不过这类问题也是最具有技巧性的,最有意思的。 题目的一般形式????????求最值,涉及到的方法是穷举。但穷举过程中会存在“重叠子问题”,由此造成穷举效率会很低。“最值”必存在“最优子结构”。但“穷举”并非易事,需要列出“正确的【状态转移方程】”。 ????????需要使用【备忘录memoization】或【DP table】来优化穷举过程。这是一种使用空间来换取时间的策略。 题目的典型特点????????“无后效性”,即:一旦一个子问题的求解得到结果,以后的计算过程就不会修改它。 两种解题思路? ? ? ? ? ? ? ? ?
DP的三要素
DP的难点? ? ? ? 不知道如何确定【状态】和【选择】,也就找不到正确的【状态转移方程】。 ????????【解决方案:通过技巧——数学归纳法】。 原因有二:
解题策略? ? ? ? 【状态转移方程】直接代表着暴力解法。千万不要看不起暴力解,只要写出了暴力解,优化方法无非是用备忘录或DP table,其它再无奥妙可言。 ? ? ? ? 更具体一点说,找【最优子结构】的过程,其实就是证明状态转移方程正确性的过程,方程符合最优子结构就可以写出暴力解了,写出暴力解就可以看出有没有重叠子问题了。有,则优化;无,则OK。这也是套路,经常刷题的朋友应该能体会。 ? ? ? ? 在实际的算法问题中,找到【状态】-->>做出【选择】-->>写出【状态转移方程】是最困难的,这也就是为什么很多朋友觉得动态规划问题困难的原因。 思维框架????????这里总结了一个思维框架,辅助你思考 状态转移方程: ????????“明确 base case ---->>>> 明确【状态】 ---->>>> 明确【选择】 ---->>>> 定义dp 数组/函数 的含义”。 ? ? ? ? 按上面的套路走,最后的结果就可以套这个框架: ?如何列出正确的状态转移方程?? ? ? ? 以?LeetCode322零钱兑换问题??和 300最长递增子序列??为例,进行讲解。
如何找到动态规划的状态转移关系?
? ? ? ? dp数组一定是求解目标值的子问题,往往是子数组的目标值。比如题目300最长递增子序列?中“以当前值结尾的最长递增子序列的长度”,题目322零钱兑换问题?中“凑出目标金额n所需的最少的硬币数量”。 技巧? ? ? ? 如果发现每次状态转移只需 DP table的一部分,那么可用“空间压缩”来缩小DP table 的大小,只记录必要的数据。 ? ? ? ? 在阅读每个题目和解法时,多往【状态】和【选择】上靠,才能对这套框架产生自己的理解,运用自如。 一些思考? ? ? ? 计算机解决问题其实没有任何奇技淫巧,它唯一的办法就是穷举,穷举所有可能性。算法设计无非就是“先思考如何穷举”,然后在追究“如何聪明地穷举”。? ?? ? ? ? ? 动态规划的核心设计思想是“数学归纳法”。 参考链接: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 3:29:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |