动态规划
来源:互联网 发布: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、穷举与动态规划
如上图所示,我们要从开始到结束选择一条路径,如:
我们可以从另一个角度考虑问题:到A1的最短路径,只有一种选择;到B1的最短路径,要么从A1出发,并且是经过到A1的最短路径,要么从A2出发,并且是经过到A2的最短路径。我们可以先计算到A1、A2的最短路径,再计算到B1、B2的最短路径,再计算到C1、C2,再计算到D1、D2的最短路径,最后计算到终点的最短路径。这样计算量就只有
一个问题的最优解包含了子问题的一个最优解,这个性质叫做最优子结构。
动态规划算法的设计可以分为如下4个步骤:
1)描述最优解的结构。
2)递归地定义最优解的值。
3)按自底向上的方式计算最优解的值。
4)由计算出的结果构造一个最优解。
3、递归和循环
递归是在函数中调用自己,也就是原问题可以通过结构相似、规模更小的子问题解决,而且递归必须有个出口。
我觉得递归问题都可以转化为循环。
- 动态规划!!!动态规划!!!
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- Python-学习笔记(一)
- 共享内存
- leetcode 377. Combination Sum IV 换钱问题
- 电量的测试方法(adb shell dumpsys batterystats)
- C语言实现顺序表
- 动态规划
- linux服务器挂载硬盘和服务器硬盘分区划分物理卷
- 错误ORA-06512的问题
- RxJava 与 Retrofit 结合使用,史上最牛搭档
- jquery中attr和prop的区别
- top命令小记~
- 从scrapy框架搭建入门python包的安装
- mysql的 日期格式化
- 简单试水nltk