数据结构_动态规划

               

     和分治法一样,动态规划是通过组合子问题的解从而解决整个问题的。从前面我们知道,分治法是将问题划分成一些独立的子问题,递归的求解各子问题。然后合并子问题的解而得到原问题的解。与此不同的,动态规划适用于子问题不是独立的情况。也就是各子问题包含公共的子子问题。在这种情况下,若用分治法则会做许多不必要的工作,即重复的求解公共的子子问题。动态规范算法对每个子子问题只求解一次。
     动态规范通常应用于最优化问题。此类问题可能有很多中可能解。每个解都有一个值,而我们希望找出一个具有最优值的解。
     动态规划算法的设计可以分为如下4个步骤:
     1,描述最优解的结构。
     2,递归定义最优解的值。
     3,按自底向上的方式计算最优解的值。
     4,由计算出的结果构造一个最优解。
     从工程的角度来看,什么时候才需要寻找一个问题的动态规划解了,在下面,我们将介绍适用采用动态规划方法的最优化问题中的两个要素:最优子结构和重叠子问题,另外,还要分析一种不同的方法,称为备忘录,以充分利用重叠子问题性质。

最优子结构:
     用动态规划求解优化问题的第一步就是描述最优解的结构。回顾一下,如果一个问题的一个最优解中包含了子问题的最优解,则该问题具有最优子结构。当一个问题具有最优子结构时,提示我们动态规划可能会适用.(注意,在这种情况下,贪心策略可能也是适用的),在动态规划中,我们利用子问题的最优解来构造问题的一个最优解。因此必须小心以确保在我们所考虑的子问题范围中,包含了用于一个最优解中的那些子问题。
     在找寻最优子结构时,可以遵循一种共同的模式。
     1,问题的一个解可以是做一个选择。例如,选择一个前一个装配线装配站;或者选择一个下标以在该位置分裂矩阵链。做这种选择会得到一个或者多个有待解决的子问题。
     2,假设对一个给定的问题,已知的是一个可以导致最优解的选择。不必关心如何确定这个选择,尽管假定它是已知的。
     3,在已知这个选择后,要确定哪些子问题会随之发生,以及如何最好的描述所得到的子问题空间。
     4,利用一种剪贴技术,来证明在问题的一个最优解中,使用的子问题的解也必须是最优的。通过假设每一个子问题的解都不是最优解,然后导出矛盾,即可做到这一点。特别地,通过减除非最优的子问题解再贴上最优解,就证明了可以得到原问题的一个更好的解,因此,这与假设已经得到一个最优解相矛盾。如果有多于一个的子问题的话,由于它们通常比较类似,所以只要对其中一个子问题的剪贴处理略加修改,即可容易地用于其他问题。
    为了描述子问题空间,可以遵循这样一条有效的经验规则,就是尽量保持这个空间简单,然后在需要的时候再去扩容它。

重叠子问题:
     适用于动态规划求解的最优化问题必须具有的第二个要素是子问题的空间要很小,也就是用来求解原问题的递归算法可反复地解同样的子问题,而不是总在产生新的子问题。典型的,不同的子问题数是输入规模的一个多项式。当一个递归算法不断的调用同一问题时,我们说该最优问题包含重叠子问题。相反的,适用于分治法解决的问题往往在递归的每一步都产生全新的问题。动态规划算法总是充分利用重叠子问题,即通过每个子问题只解一次,把解保存在一个在需要时就可以查看的表中,而每次查找表的时间为常数。

动态规划要求其子问题既要独立又要重叠,这看上去是有些奇怪。虽然这两点听起来可能是矛盾的。但是它们描述了两种不同的概念,而不是同一个问题的两个方面。如果同一个问题的两个子问题不共享资源,则它们就是独立的。对两个子问题来说,如果它们确实是相同的子问题,只是作为不同问题的子问题出现的话,是重叠的,则它们是重叠的。

做备忘录:
   动态规划有一种变形,它既具有通常的动态规划的效率,又采用了一种自顶向下的策略。其思想就是备忘原问题的自然但低效的递归算法。像在通常的动态规划中一样,维护一个记录了子问题解的表,但有关填表动作的控制结构更像递归算法。

   加了备忘的递归算法为每一个子问题的解在表中记录一个表项。开始时,每个表项最初都是包含一个特殊的值,以表示该表项有待填入。当在递归算法的执行中第一次遇到一个子问题时,就计算它的解并填入表中。以后每次遇到该问题时,只要查看并返回表中先前填入的值即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值