动态规划的本质
常用的五大算法,包含 动态规划、分治法、贪心求解法、回朔法、分支限界法。
动态规划(Dynamic Programming),与其说是一种算法,不如说是一种解决问题的思路。 :peach:
Dynamic Programming is a methed for solving a complex problem by breaking it down into a collection of simpler subproblems.
上述引自维基百科,也就是说动态规划就是将一个复杂的问题分解成若干简单的问题集的一种方法。
那么怎么分解问题就成了动态规划的本质。
而分解问题,依靠的就是 问题的状态 和 状态之间的转移。
- 如何定义一个状态
我们需要找到一个问题在某一个状态的 最优解。 :strawberry:
举个例子:
最长递增子序列(LIS)
给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)
例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8}
则其最长的单调递增子序列为{5,6,7,8},长度为4
由此我们定义一个状态,当以第i个数组元素结尾的最长递增子序列dp(i)。
整个数组的LIS就是dp(1)…dp(