动态规划总结

动态规划算法是用来解决一类最优化问题的算法思想,比如说你运用了一个算法解决了一个问题,但是呢,这个算法时间复杂度比较高,那么我们如何进行优化降低它的时间复杂度呢?当然优化算法有很多种这里运用动态规划算法来进行优化,使用动态规划可以让时间复杂度降到最低,因为它是用来解决一类最优化问题的算法思想。

那么我们如何判断某一类问题的求解可以运用动态规划呢???

 首先,我们需要了解下面两组概念:重叠子问题 和 最优子结构

重叠子问题:如果一个问题的求解可以被分为若干个子问题的求解,且这些子问题会不断的重复出现,那么就称这个问题拥有重叠子问题【一般我们解决重叠子问题的时候,会利用dp数组将这些子问题的解存放起来,当下次用到,就直接调用dp数组,而不用又去重新求解,浪费时间---->这种解法我们称之为记忆化搜索,记忆化搜索常用递归去实现:比如斐波那契数列递归记忆化搜索、01背包问题运用递归记忆化搜索等等,,,我们也称之为动态规划的递归写法

最优子结构:如果一个问题的最优解可以由其子问题的最优解有效构造/递推出来,那么称这个问题拥有最优子结构【对于这种拥有最优子结构的问题解法,我们往往可以利用递推去解决,即利用dp数组进行递推,比如背包问题,数塔问题,最长公共子序列问题,DAG最长路的求解,最长回文字串问题等等,,我们称之为动态规划的递推写法

 

 我们一般可以使用递归或者递推的写法来实现动态规划,其中递归写法在此处又称作记忆化搜索

动态规划用递归去实现的计算方式是自顶向下,即从目标问题开始,将它分解成子问题的组合,直到分解至边界为止(利用dp数组记录子问题的解,以便下次调用的时候直接返回dp记录的结果)

动态规划用递推去实现的计算方式是自底向上,即从边界开始(利用dp数组进行初始化,即考虑边界情况,在边界,dp数组是可以确定的)不断向上解决问题,直到解决了目标问题

综上:一个问题需要拥有重叠子问题或最优子结构的性质,方可运用到动态规划算法去进行优化。

 

下面请自行思考以下两个问题:

1、分治与动态规划有什么区别? 

      相同点:它们都是将原问题划分成规模较小的子问题,最后合并子问题的解得到元问题的解

     不同点:动态规划解决的问题拥有重叠子问题,而分治没要求(比如归并排序,快速排序等,求解过程中是不出现重叠子问题的,因此它们那种求解方法叫分治法,而不是动态规划解法),不拥有重叠子问题的动态规划解法那就叫分治了,而不叫动态规划。另外,分治法解决的问题不一定是最优的,但是动态规划解决的问题一定是最优化问题

2、贪心与动态规划又什么区别?

      首先,贪心和动态规划都要求原问题拥有最优子结构,贪心算法采用计算方式是自顶向下,贪心是一种壮士断腕的决策,只要进行了选择,就不会后悔,显然这种算法"最优选择"的正确性需要一定的数学归纳法证明。以数塔问题为例,数塔问题虽然具有最优子结构,但是如果采用贪心算法去解决,这种所谓的"最优选择"是错误的,最后并不能得到正确的解法。

 

下面我们探讨如何利用动态规划???

对于动态规划可以解决的问题,总会有很多设计状态的方式,因此我们必须设计一个具有无后效性的状态以及状态转移方程 

 多阶段动态规划问题

以背包问题为例

我们的常规解法是利用递归去求解,其时间复杂度达到了2的n次方,但我们仔细发现,此问题拥有重叠子问题呀!!!(可自行画出递归图)那么我们肯定就可以利用动态规划去解决了,就是利用dp数组记录子问题解,当遇到此子问题,直接return dp[i]就行了 ,这叫做动态规划的递归实现(也叫记忆化搜索)我们再仔细研究研究,我们可以从记忆化搜索出发推导出递推式(对动态规划熟练的话,可以直接判断出此类背包问题存在最优子结构,可自行写出递推式),这样就可以采用动态规划的递推写法(只需要两个for循环即可搞定)。

有时候我们在解决一个问题的时候,如果设计出来的算法时间复杂度很高,确实要考虑看一下能否用动态规划算法去进行优化(主要看此类问题是不是重叠子问题 或 最优子结构)如果能用dp,则就需要设计状态 和 设计具有无后效性的状态转移方程了。设计技巧:如果当前设计的状态下不满足无后效性,那么不妨把状态进行升维,即增加一维或若干维来表示相应信息,这样可能就满足无后效性了! 

比如:01背包问题中,如果dp数组只是一维,那么无法设计出递推式,我们可以考虑:(既然题目上是说将n件物品放入容量为v的背包中,是否能考虑将n作为一个维度,v又作为一个维度呢?)将dp上升到二维dp[i][j]。

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值