理解dynamic programming动态规划
何谓动态规划?
以菲波那切数列为例,
int fib(int n ){
if(n == 0 || n ==1){
return 1;
}else{
return fib(n - 1) + fib(n - 2);
}
7 }
该递归调用中,有大量重复子集,如图

在计算fib(5) 的时候,多次计算了fib(2)的值。那为何不在递归搜索的基础上,添加一个小笔记本进行记忆化:只在第一次fib(2)的时候计算结果,而下次再call fib(2)的时候, 可以直接O(1)时间从记事本拿到该结果。
public int fib(int n ){
if( n == 0 || n == 1) return 1;
int [] memo = new int[n + 1]; // 另开一个空间memo记录
Arrays.fill(memo, -1); //memo上初始值都为-1
if(memo[n] == -1){ // 若该值没被记录过
memo[n] = fib(n-1) + fib (n-2); //计算并记录在memo中
}
return memo[n]; //否则,该值不等于defalut的-1 表示已被记录过,直接拿结果
}
那么,也可以在一个数组中滚动计算出最终memo[n], 这就是DP
public int fib(int n ){
int [] memo = new int[n + 1];
memo[0] = 1;
memo[1] = 1;
for(int i = 2; i <=n; i++){
memo[i] = memo[i-1] + memo[i-2];
}
return memo[n];
}
总结: 实际上,它们都是递归问题。在很多情况下,用记忆化搜索解出来的答案通常都是能满足需求的。只是动态规划的整个代码会更简洁清晰。也有很多面试官把递归调用时使用记忆化搜索等同于动态规划(top down with memorization is already DP)。当然,条件相同时,动态规划肯定更优。因为记忆化搜索的递归调用中,递归调用需要额外开销。空间角度,使用递归调用需要占用系统的栈空间。
理解dynamic programming动态规划的更多相关文章
- Dynamic Programming 动态规划入门笔记
算法导论笔记 programming 指的是一种表格法,并非编写计算机程序 动态规划与分治方法相似,都是通过组合子问题的解来求解原问题.但是分治法将问题划分为互不相交的子问题.而动态规划是应用与子问题 ...
- Dynamic Programming(动态规划)
钢材分段问题 #include<iostream> #include<vector> using namespace std; class Solution { public: ...
- [Dynamic Programming]动态规划之背包问题
动态规划之背包问题 例题 现有4样物品n = ['a', 'b', 'c', 'd'],重量分别为w = [2, 4, 5, 3],价值分别为v = [5, 4, 6, 2].背包最大承重c = 9. ...
- 强化学习三:Dynamic Programming
1,Introduction 1.1 What is Dynamic Programming? Dynamic:某个问题是由序列化状态组成,状态step-by-step的改变,从而可以step-by- ...
- 对动态规划(Dynamic Programming)的理解:从穷举开始(转)
转自:http://janfan.cn/chinese/2015/01/21/dynamic-programming.html 动态规划(Dynamic Programming,以下简称dp)是算法设 ...
- 动态规划(Dynamic Programming)算法与LC实例的理解
动态规划(Dynamic Programming)算法与LC实例的理解 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Le ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 动态规划Dynamic Programming
动态规划Dynamic Programming code教你做人:DP其实不算是一种算法,而是一种思想/思路,分阶段决策的思路 理解动态规划: 递归与动态规划的联系与区别 -> 记忆化搜索 -& ...
- 最优化问题 Optimization Problems & 动态规划 Dynamic Programming
2018-01-12 22:50:06 一.优化问题 优化问题用数学的角度来分析就是去求一个函数或者说方程的极大值或者极小值,通常这种优化问题是有约束条件的,所以也被称为约束优化问题. 约束优化问题( ...
随机推荐
- python redis启用线程池管理
pool = redis.ConnectionPool(host=REDIS_HOST, port=REDIS_PORT,max_connections=3,password=REDIS_PASSWO ...
- 图片尺寸批量resize的matlab并行代码
在caffe ImageNet例子中有对图片进行resize的部分,文中使用的是linux shell脚本命令: for name in /path/to/imagenet/val/*.JPEG; d ...
- javascript创建对象之动态原型模式(五)
function Human(name, sex) { this.name = name; this.sex = sex; if (typeof this.say != "function& ...
- securecrt8注册码
securecrt8注册码,两个可用 Name:meisiCompany:TEAM ZWTSerial Number:03-14-367662License Key:ACCFAX R9FHJ7 QZV ...
- windows hbase installation
In the previous post, I have introduced how to install hadoop on windows based system. Now, I will ...
- bootstrap3中select2的默认值和下拉框的禁用
最近做项目用到了select2插件,需求中需要给下拉框设置默认值之后,禁用下拉框,我开始的写法是这样的 <script type="text/javascript"> ...
- head 标签
1.<meta - > <meta charset="UTF-8"> #utf-8字符编码 <meta http-equiv="Refres ...
- 使用 C++11 编写类似 QT 的信号槽——下篇
要实现 Signal-Slot,Signal 类中应该拥有一个保存 std::function 的数组: template<class FuncType> class Signal { p ...
- ArrayList 原理(2)
1. 概述 关于Java集合的小抄中是这样描述的: 以数组实现.节约空间,但数组有容量限制.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预 ...
- mtr 命令详解
一般在windows 来判断网络连通性用ping 和tracert,ping的话可以来判断丢包率,tracert可以用来跟踪路由,在Linux中有一个更好的网络连通性判断工具,它可以结合ping ns ...