理解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 一.优化问题 优化问题用数学的角度来分析就是去求一个函数或者说方程的极大值或者极小值,通常这种优化问题是有约束条件的,所以也被称为约束优化问题. 约束优化问题( ...
随机推荐
- 微信jssdk批量添加卡券接口
1)首先是官方接口文档: 1.批量添加卡券接口:https://mp.weixin.qq.com/wiki?action=doc&id=mp1421141115&t=0.0861973 ...
- oracle11g的dmp文件导入oracle10g时报错:头部验证失败
因为本机安装的10g版本的Oracle,需要导入一个11g版本导出的dmp文件,Oracle数据库版本之间存在兼容的问题,低版本的库不能导入高版本的dmp文件,在CMD中导入dmp文件总是出现如下错误 ...
- 朴素贝叶斯-对数似然Python实现-Numpy
<Machine Learning in Action> 为防止连续乘法时每个乘数过小,而导致的下溢出(太多很小的数相乘结果为0,或者不能正确分类) 训练: def trainNB0(tr ...
- html5 如何实现客户端验证上传文件的大小
在HTML 5中,现在可以在客户端进行文件上传时的校验了,比如用户选择文件后,可以 马上校验文件的大小和属性等.本文章向码农介绍html5 如何实现客户端验证上传文件的大小,感兴趣的码农可以参考一下. ...
- SpringBoot入门篇--读取资源文件配置
在项目的开发中,我们知道的是SpringBoot框架大大减少了我们的配置文件,但是还是留下了一个application.properties文件让我们可以进行一些配置.当然这些配置必然是包括服务器的配 ...
- 代码生成器 CodeSmith 的使用(三)
在第二篇中,介绍了用 codesmith 生成数据库中的一些字段,可生成的属性不够简洁,这次对上一次的版本进行重构,生成一些简洁的属性访问器.代码如下: Camel 规则: <%-- Name: ...
- HTML+CSS实现页面
使用HTML和CSS实现以下页面: 抽屉首页 个人博客首页 小米官网首页 登录注册页面 一.抽屉首页 1.实现目标:https://dig.chouti.com/ 2.代码: HTML: <!- ...
- Nginx-ingress-controller部署
参考官网https://kubernetes.github.io/ingress-nginx/ 部署pod:nginx-ingress-controller/nginx-default-backend ...
- 如何使用change命令改变密码的属性
使用chage更改用户密码密码使用情况 -d //设置最近一次更改密码时间, 0下次登陆系统强制修改密码 -m //设置用户两次改变密码之间使用"最小天数" -M //设置用户两次 ...
- zabbix监控windows磁盘空间
监控windows磁盘空间,不是百分比. 当windows系统添加相应的windows模板后,会自动生成检测系统空间的监控项,在应用集(Filessystem)里面,Free disk space o ...