证明:任何可以用动态规划法求解的问题,一定可以用循环实现(不需要递归)?

一般实际生活中我们遇到的算法分为四类:

而今天所要总结的算法就是着重解决  最优化问题 

《算法之道》对三种算法进行了归纳总结,如下表所示:

很多子问题重复(不独立)

    1)规模如果很小,则很容易解决。//一般问题都能满足

    4)分解出的各个子问题相互独立,子问题不再包含公共子问题。 //效率高低

       自底向上(每一步,根据策略得到一个更小规模的问题。最后解决最小规模的问题。得到整个问题最优解)

         特征:动态规划任何一个i+1阶段都仅仅依赖 i 阶段做出的选择。而与i之前的选择无关。但是动态规划不仅求出了当前状态最优值,而且同时求出了到中间状态的最优值。

       自顶向下(就是每一步,根据策略得到一个当前最优解。传递到下一步,从而保证每一步都是选择当前最优的。最后得到结果)

贪心算法:贪心算法采用的是逐步构造最优解的方法。在每个阶段,都在一定的标准下做出一个看上去最优的决策。决策一旦做出,就不可能再更改。做出这个局部最优决策所依照的标准称为贪心准则。

分治算法:分治法的思想是将一个难以直接解决大的问题分解成容易求解的子问题,以便各个击破、分而治之。 

动态规划:将待求解的问题分解为若干个子问题,按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。 

二、算法间的关联与不同 

1、分治算法与动态规划 

分治法所能解决的问题一般具有以下几个特征: 

① 该问题的规模缩小到一定程度就可以容易地解决。 

② 该问题可以分为若干个较小规模的相似的问题,即该问题具有最优子结构性质。 

③ 利用该问题分解出的子问题的解可以合并为该问题的解。

④ 该问题所分解出的各个子问题是相互独立的且子问题即之间不包含公共的子问题。 

上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;

第二条特征是分治法应用的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;

第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心算法或动态规划算法;

第四条特征涉及到分治法的效率,如果各个子问题不是独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。这类问题虽然可以用分治法解决,但用动态规划算法解决效率更高。 

当问题满足第一、二、三条,而不满足第四条时,一般可以用动态规划法解决,可以说,动态规划法的实质是: 分治算法思想+解决子问题冗余情况 

2、贪心算法与动态规划算法 

多阶段逐步解决问题的策略就是按一定顺序或一定的策略逐步解决问题的方法。分解的算法策略也是多阶段逐步解决问题策略的一种表现形式,主要是通过对问题逐步分解,然后又逐步合并解决问题的。     

贪心算法每一步都根据策略得到一个结果,并传递到下一步,自顶向下,一步一步地做出贪心决策。    

动态规划算法的每一步决策给出的不是唯一结果,而是一组中间结果,而且这些结果在以后各步可能得到多次引用,只是每走一步使问题的规模逐步缩小,最终得到问题的一个结果。

举例:如图1有一三角形数塔,求一自塔顶到塔底的路径,要求该路径上结点的值的和最大。 

贪心算法解题过程:自顶向下从第一层9开始,到第二层,选数值较大的15,第三层,在可选路径中选数值较大的8,同理,第四层选9,第五层选10,这样就确定了一条路径:9→15→8→9→10。 

动态规划算法接题过程:如图2,阶段1:自第五层开始,对经过第四层的2的路径,在第五层的19、7中选择数值较大的19,同理,对经过第四层18的路径,选10,对经过第四层9的路径,选10,对经过5的路径选16。

显然,以上数塔问题用贪心算法得不到最优解,这里只是用作与动态规划算法的比较。 


①贪心选择性质:在求解一个问题的过程中,如果再每一个阶段的选择都是当前状态下的最优选择,即局部最优选择,并且最终能够求得问题的整体最优解,那么说明这个问题可以通过贪心选择来求解,这时就说明此问题具有贪心选择性质。

②最优子结构性质:当一个问题的最优解包含了这个问题的子问题的最优解时,就说明该问题具有最优子结构。 

分治算法:见二、算法间的关联与不同中的①②③④。 

①最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

②无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

③有重迭子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。 

采用动态规划方法,可以高效地解决许多用贪婪算法或分而治之算法无法解决的问题。

但贪心算法也有它的优势:构造贪心策略不是很困难,而且贪心策略一旦经过证明成立后,它就是一种高效的算法。

}

1 先把细节全部都记下来
3 反复完之后,化繁为简,浓缩成就一点

动态规划的本质就是将一个复杂的问题,分解成重复性子问题.
分治,回溯,递归,动态规划都差不多,只是一些小的细节问题
分治 Divide & Conquer ;它是递归的一种特殊形式,因为复杂的问题,都有很多重复性子问题,分别运算,再返回结果


 

动态规划Dynamic Programming:wiki中DP的定义是需要进行分治,DP和分治有内在联系,和分治的区别(动态规划问题是让求最优解,最大值,最少的方式, 所以在中间部分不需要保存所有的状态,只需要保存最优的状态,还要证明,如果每一步存最优的值,最后可以推导出全局最优的值, 所以引入了两个,一个是有所谓的缓存,或者是状态的存储数组,第二个就是每一步的话都会把次优的状态淘汰掉,只保留在这一步里面最优或者较优的一些状态推导出全局最优)
动态规划DP和递归或者分治,没有根本的区别,(关键看有无最优子结构,如果没有最优子结构,说明所有的问题都需要计算一遍,同时把结果合并在一起,传统意义上就称之为分治)
差异性:最优子结构,中途可以淘汰次优解,当然也必须淘汰次优解

在计算机竞赛的时候,只要写递归,所有竞赛型选手全部都是直接开始for循环,全部是自底向上的写循环,开始递推

这也是为什么DP很多时候我们把它翻译为动态递推就是这个原因

}

· 专注解答各类生活疑难问题

联系:都是问题求解之时的一种算法。

1、贪心算法:把子问题的解局部最优解合成原来解问题的一个解。

2、递归算法:问题解法按递归算法实现。如Hanoi问题;数据的结构形式是按递归定义的。如二叉树、广义表等。

3、动态规划:动态规划算法通常用于求解具有某种最优性质的问题。

4、分治算法:可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。

1、贪心算法:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。

2、递归算法:通过重复将问题分解为同类的子问题而解决问题。

3、动态规划:将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。

4、分治算法:将一个规模为N的问题分解为K个规模较小的子问题。

1、贪心算法:根据题意选取一种量度标准。

2、递归算法:递归就是在过程或函数里调用自身。

3、动态规划:虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。

4、分治算法:原问题可以分解为多个子问题;原问题在分解过程中,递归地求解子问题;在求解并得到各个子问题的解后。

递归,简单的重复,计算量大。
分治,解决问题独立,分开计算,如其名。
动态规划算法通常以自底向上的方式解各子问题,
贪心算法则通常以自顶向下的方式进行;
动态规划能求出问题的最优解,贪心不能保证求出问题的最优解

本回答被提问者和网友采纳

下载百度知道APP,抢鲜体验

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多关于 动态规划问题求解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信