动态规划
2017-06-09 17:15
134 查看
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、穷举与动态规划
如上图所示,我们要从开始到结束选择一条路径,如:A1→B2→C1→D1。A,B,C,D四个模块,每个模块有两个选择,如果用穷举法的话一共有24中选择。
我们可以从另一个角度考虑问题:到A1的最短路径,只有一种选择;到B1的最短路径,要么从A1出发,并且是经过到A1的最短路径,要么从A2出发,并且是经过到A2的最短路径。我们可以先计算到A1、A2的最短路径,再计算到B1、B2的最短路径,再计算到C1、C2,再计算到D1、D2的最短路径,最后计算到终点的最短路径。这样计算量就只有2∗4。
一个问题的最优解包含了子问题的一个最优解,这个性质叫做最优子结构。
动态规划算法的设计可以分为如下4个步骤:
1)描述最优解的结构。
2)递归地定义最优解的值。
3)按自底向上的方式计算最优解的值。
4)由计算出的结果构造一个最优解。
3、递归和循环
递归是在函数中调用自己,也就是原问题可以通过结构相似、规模更小的子问题解决,而且递归必须有个出口。我觉得递归问题都可以转化为循环。
相关文章推荐
- POJ 1160 Post Office(动态规划)
- 一、动态规划(2)奇怪的电梯
- 动态规划——编辑距离
- 【原】 POJ 1163 The Triangle 三角形最大路径 动态规划 解题报告
- 蒜头爬楼梯-动态规划
- LeetCode 64. Minimum Path Sum 动态规划
- 【动态规划】新年趣事之打牌
- 动态规划求解最大字段和及其变种问题
- 动态规划实例(十五):最短路径Floyd
- POJ 3624 0-1背包问题 动态规划
- 阿牛的EOF牛肉串-记忆化搜索或动态规划
- 动态规划题集2
- POJ 1651 Multiplication Puzzle 动态规划及搜索
- BestCoder 1st Anniversary ($) Souvenir 动态规划
- 实际问题的算法抽象——动态规划中的01背包问题
- POJ 3132 Sum of Different Primes 动态规划 DP 0-1背包问题
- 合唱队形-动态规划
- 模拟题 动态规划
- 动态规划理解
- 方砖问题(动态规划)