动态规划---基础讲解---和深搜有点像,不过也是懵懵的

先说下什么是动态规划:

动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。---来自百度百科

嗯,上面什么意思呢?就是求符合要求的最优解,至于分治法是个什么鬼,我也不知道.........

什么叫最优解呢,举个例子:

有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。

见过的都知道这个题符合,斐波那契数列F(n) = F(n-1) + F(n-2)(n >= 3),没见过的现在见了,想一下,应该都见过吧,不就结了,接着说;

看这个式子比如,我们现在在第n阶,想知道到这里有多少种方法,我们到第n阶有几种方法,我们只能从第n-1阶或者n-2阶上去,不明白的看下问题

那么同样到第n-1阶,有多少种方法呢,这个可以由n-2和n-3得到,这个和递归有点像,递归比超时

简单说上面的就是第10阶由第8阶和第9阶的和得到

当时求斐波那契数列数列的时候,为了避免超时,我们用数组来进行操作,代码就算了,真想要代码的找个斐波那契代码改下就行,主要是博主比较懒

下来引入三个动态规划的概念:最优子结构,边界,动态转移方程

借助上面的例子来解释三个概念

最优子结构:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略---(来自百度百科),反正我看的很懵逼,简单说就是第n-1阶和n-2阶

边界:就是要求的范围,或者说就是初始值必须确定

动态转移方程:这个简单理解就是,将所有的最优子结构满足题意的揉到一起,比如上面就是两个最优子结构相加

下来说说为什么要用动态规划,就是上面百度百科里面说的避免重复计算,降低时间复杂度,我既然算过这个最优子结构的值,我为什么不存起来,这样方便后面用到,也就是拿空间换时间,毕竟所给的空间够大

至于具体的练习题目,什么数塔问题,走格子,等等

这只是一篇对动态规划的总述,至于里面的树形dp,区域dp,插头dp,背包问题,随后写,主要是瞌睡

 

posted @ 2019-08-25 22:05  RE-TLE  阅读(415)  评论(0编辑  收藏  举报