递归和动态规划的关系
来源:互联网 发布:python json dump 编辑:程序博客网 时间:2024/06/05 21:11
内容会持续更新,有错误的地方欢迎指正,谢谢!
动态规划
动态规划的三个特征
- 适用于最优解问题
- 有大量的重复子问题
- 子问题之间有依赖(不独立)
而递归与动态规划的不同在于第2点
这些重复的子问题,DP算法将其结果保存下来,等下一次又要计算该子问题时,直接用已计算好的;而递归却不是这样,它会一遍又一遍地计算这些重复的子问题,从而效率狂降。
总结:
子问题重复率较高的递归算法可改写成动态规划,但不是所有递归算法都适合改成动态规划。
递归和动态规划的关系 举例
自顶向下的动态规划实现:用的递归。
自底向上的动态规划实现:用的迭代。
斐波拉契数列
1.递归实现:效率特别低,指数级的时间复杂度。
int Fibo(int n){ if(n==0) return 0; if(n==1) return 1; return Fibo(n-1)+Fibo(n-2);}
2.自底向上的动态规划实现:迭代。只要有存储已经计算出的值的空间,就能把这项技术应用到任何递归计算中,就能把算法从指数级运行时间向线性运行时间改进。
int Fibo(int n){ int temp[n+1]; temp[0]=0; temp[1]=1; for(int i=2;i<n+1;++i) { temp[i]=temp[i-1]+temp[i-2]; } return temp[n];}
3.自顶向下的动态规划实现:递归。存储它所计算的每一个值(正如下方代码最末的步骤),并通过检查所存储的值,来避免重新计算它们的任何项(正如最初的步骤)。
#include <iostream>#include <string.h>using namespace std;#define N 12int array[N] = {0};int Fibo(int n){ //不等于初始值0,则表示该元素已经求解过了,直接用其值即可。 if(array[n]!=0) return array[n]; if(n==0) return array[n] = 0; if(n==1) return array[n] = 1; if(n>1) return array[n] = Fibo(n-1)+Fibo(n-2);}int main(){ memset(array,0,sizeof(array)); cout << Fibo(N) << endl; return 0;}
总结:
在自顶向下的动态规划中,我们存储已计算的每个值。
在自底向上的动态规划中,我们预先计算这些值并存储待用。
我们常常选择自顶向下的动态规划而不选自底向上动态规划,其原因如下:
- 自顶向下的动态规划是一个自然的求解问题的机械转化。
- 可能不需要计算所有儿子的解。
阅读全文
1 0
- 递归和动态规划的关系
- 递归与动态规划关系
- 动态规划和递归
- 递归和动态规划
- 动态规划和递归
- 递归和动态规划
- 递归和动态规划
- 递归和动态规划
- 递归和动态规划的转换
- floyd算法和动态规划的关系
- 找零的递归和循环实现,动态规划
- Python练习(1):递归和动态规划的简单应用
- 递归和动态规划的算法题(1)
- 递归与动态规划---矩阵的最小路径和
- 递归、分治策略、动态规划以及贪心算法之间的关系
- 动态规划和递归试题整理
- 动态规划和递归、循环、迭代
- poj1664+放苹果+递归和动态规划
- PAT 1001. 害死人不偿命的(3n+1)猜想 (15)
- HTML基础(3.2 input)
- 后台管理系统操作日志模块设计思路
- 平面几何常用模板
- 利用联合体判断CPU是大端模式还是小端模式
- 递归和动态规划的关系
- 解决jdk1.7,1.8共存问题
- 判断1000~2000之间的闰年
- 多线程——猜数字
- PAT 1002. 写出这个数 (20)
- [HEOI2012]采花
- 海森矩阵(Hessian Matrix)
- 请求大佬看看C#这个怎么写进去
- 差分约束系统模板