动态规划的历史渊源
动态规划问题是由Bellman教授提出的一种用于解决当问题的规模很大时利用转移而将问题分割为子问题的一种算法思想。他也在1979年获得了ACM,IEEE协会颁发的终生成就奖。
动态规划问题的一般思路
由上面的论述,我们可以知道,动态规划问题是用来解决问题规模很大而大问题可以分割为子问题并且加以解决的一种算法思想, 那么, 我们怎么样解决一个动态规划问题呢?
我们从一个十分常见的问题说起:单源最短路径问题。我们如何求两个点之间的最短路径, 尤其是这两个点之间可能存在很多中路径的情况呢?当然,你可以尝试所有点之间的边,也就是对你手中的图进行DFS遍历,但是,我们知道,这样的路径组合会非常恐怖,为了不重复在DFS遍历的同时你还需要进行回朔操作, 这个算法的时间复杂度将是O(deg(1)*deg(2)….),即指数级的复杂度,对我们来说太复杂了。
但是,我们可以作如下的思考,对于我们要求最短路径的任意结点对u,v,我们从终点v进行逐层递归,在这里,我们设两个点之间的最短距离为w(u,v),两点之间的边用e(u,v)来表示的话那么如果v和a1,a2…..an临接话,w(u,v)=min(w(u,ai)+e(ai,u)),其中i为1-n间的任意一个数,至此,我们便设计好了子问题的模型.
那么有了子问题,下一步的工作就是递归求解了,那么递归求解的上界是什么呢?根据图论中的内容,两个点之间联通的话一定存在不大于|V|-1条边的通路,所以我们的递归上界是n(在第n次递归中检查负环)。
至此,我们便得到了著名的Bellman-ford算法
BELLMAN-FORD(G,w,s)
INITIALIZE-SINGLE-SOURCE(G,s)
for i=1