动态规划

来源:互联网 发布:ionic lab for mac 编辑:程序博客网 时间:2024/06/09 18:58

1、递归与动态规划

我记得第一个递归方法是求n的阶乘:

"""return n's factorial"""def fact(n):    if n <=1:         return 1    return n*fact(n-1)

再写一个求fabnaci数列中第n个位置的值的函数,也用递归:

def fabnaci(n):    if n <= 1:        return 1    return fabnaci(n-1) + fabnaci(n-2)

这两个函数看似相似,但是是有区别的,以n=5为例:
这里写图片描述
图中左侧是fabnaci的计算过程,右侧是阶乘的计算过程。

它们的相似之处是:将原问题分解成一个或多个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。

不同之处是:fabnaci的子问题有重复的,而阶乘子问题没有重复的。

那fabnaci的计算效率就很低了,如果把计算过的结果存储起来,下次用到直接查询,这样就可以避免重复计算了。

参考:http://blog.csdn.net/deepit/article/details/6530282

2、穷举与动态规划

这里写图片描述
如上图所示,我们要从开始到结束选择一条路径,如:A1B2C1D1A,B,C,D四个模块,每个模块有两个选择,如果用穷举法的话一共有24中选择。

我们可以从另一个角度考虑问题:到A1的最短路径,只有一种选择;到B1的最短路径,要么从A1出发,并且是经过到A1的最短路径,要么从A2出发,并且是经过到A2的最短路径。我们可以先计算到A1、A2的最短路径,再计算到B1、B2的最短路径,再计算到C1、C2,再计算到D1、D2的最短路径,最后计算到终点的最短路径。这样计算量就只有24


一个问题的最优解包含了子问题的一个最优解,这个性质叫做最优子结构

动态规划算法的设计可以分为如下4个步骤
1)描述最优解的结构。
2)递归地定义最优解的值。
3)按自底向上的方式计算最优解的值。
4)由计算出的结果构造一个最优解。

3、递归和循环

递归是在函数中调用自己,也就是原问题可以通过结构相似、规模更小的子问题解决,而且递归必须有个出口。

我觉得递归问题都可以转化为循环。

原创粉丝点击