算法思想
dynamic programming is a method for solving a complex problem by breaking it down into a collection of simpler subproblems.——维基百科
动态规划的思想:将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存下来,即空间换时间。
算法本质
动态规划的本质(核心),是对问题状态的定义和状态转移方程的定义,也可以用非数学的话来描述:原问题的解如何由子问题的解组合而成。
考察一个实际问题:
斐波那契数列:1、1、2、3、5、8、13、21、34、……
数学定义:F(0)=1,F(1)=1,F(2)=2,……, F(n)=F(n-1)+F(n-2)
上述的F(n)就是一个子问题,也就可以叫做状态,定义”F(n)为斐波那契数列的第n个数“,就叫做状态的定义。
而对于数学方程F(n)=F(n-1)+F(n-2),可以理解为从状态F(n-1)和F(n-2)转移到状态F(n),而这样的方程的定义就叫做状态转移方程的定义。
在对状态和状态转移方程的定义过程中,满足“最优子结构”是一个隐含的条件(否则根本定义不出来)。

动态规划是一种解决复杂问题的方法,通过分解问题为子问题并利用子问题的解来构建原问题的解。它涉及最优子结构、无后效性和重叠子问题的特性。动态规划适用于具有这些特性的最优化问题,如斐波那契数列等。与分治和贪心算法不同,动态规划处理子问题的重叠,避免重复计算,通过状态转移方程和边界条件来构建最优解。
最低0.47元/天 解锁文章
4万+





