
动规解题的一般思路--算法学习
分解问题成为子问题:将原问题拆分成多个规模更小的子问题,子问题与原问题形式相同,只是规模减小。 确定状态:状态是问题中相互关联的变量的组合,即一个或多个子问题的解所需的变量集合。每个状态用一个数组维度对应,数组的维度数量等于状态变量的数量。 确定初始状态:初始状态是边界条件下的解值,通常位于问题规模最小的地方。 建立状态转移方程:定义不同状态之间的关系,确定如何从已知的状态解出下一个状态的值。例如,在数字三角形问题中,某个点的值由其左边和上面的点的值之和决定。 最优子结构性质:问题的最优解包含了子问题的最优解,允许递归应用。 无后效性:当前状态的值一旦确定,不会被后续计算所改变。 规模一致性:状态的数目可预先确定,为表格法提供基础。
发布日期:2021-05-15 00:27:54
浏览次数:14
分类:精选文章
本文共 778 字,大约阅读时间需要 2 分钟。
递归函数和动态规划都是解决复杂问题的高效方法,但它们在实现细节和优化方式上有明显差异。动态规划本质上是对递归函数的优化,通过缓存中间结果来避免重复计算,从而提升效率。
动态规划与递归函数的关系
递归函数通过不断地分解大问题为小问题来解决,而动态规划同样采用类似的方法,但在实现时存储中间解,减少重复计算。动态规划通过建立数组来保存每个“状态”的解,这里的状态是由相关的变量组合而成的。每个状态对应一个或多个子问题的解,状态的数量决定了动态规划的状态空间,进而影响算法的时间复杂度。
动态规划的步骤解析
数字三角形的动态规划示例
以数字三角形问题为例,每个点的值由其左边和上边的值决定。数组的维度为行列号和,状态对应每个点的位置。初始化时,底边的值被设置为已知。在状态转移方程中,每个点的值被计算为左边和上边的值之和,这样通过逐层填充数组,得到整个问题的解。
动态规划的特点
通过以上步骤,动态规划能够有效解决规模较大的问题,避免了递归函数可能导致的重复计算,提升算法效率。理解和应用这些步骤对解决复杂问题至关重要。
发表评论
最新留言
很好
[***.229.124.182]2025年04月29日 14时50分08秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
成功解决升级virtualenv报错问题
2019-03-08
【SQLI-Lab】靶场搭建
2019-03-08
【Bootstrap5】精细学习记录
2019-03-08
LeetCode197.打家劫舍
2019-03-08
A simple problem HDU-2522 【数学技巧】
2019-03-08
Struts2-从值栈获取list集合数据(三种方式)
2019-03-08
vscode中快速生成vue模板
2019-03-08
参考图像
2019-03-09
设计模式(18)——中介者模式
2019-03-09
用JavaScript实现希尔排序
2019-03-09
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
2019-03-09
BUU-MISC-认真你就输了
2019-03-09
BUU-MISC-caesar
2019-03-09
【专题2:电子工程师 之 上位机】 之 【36.事件重载】
2019-03-09
【专题3:电子工程师 之 上位机】 之 【46.QT音频接口】
2019-03-09
一文理解设计模式--命令模式(Command)
2019-03-09
VTK:可视化之RandomProbe
2019-03-09