何谓动态规划?

以菲波那切数列为例,

 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动态规划的更多相关文章

  1. Dynamic Programming 动态规划入门笔记

    算法导论笔记 programming 指的是一种表格法,并非编写计算机程序 动态规划与分治方法相似,都是通过组合子问题的解来求解原问题.但是分治法将问题划分为互不相交的子问题.而动态规划是应用与子问题 ...

  2. Dynamic Programming(动态规划)

    钢材分段问题 #include<iostream> #include<vector> using namespace std; class Solution { public: ...

  3. [Dynamic Programming]动态规划之背包问题

    动态规划之背包问题 例题 现有4样物品n = ['a', 'b', 'c', 'd'],重量分别为w = [2, 4, 5, 3],价值分别为v = [5, 4, 6, 2].背包最大承重c = 9. ...

  4. 强化学习三:Dynamic Programming

    1,Introduction 1.1 What is Dynamic Programming? Dynamic:某个问题是由序列化状态组成,状态step-by-step的改变,从而可以step-by- ...

  5. 对动态规划(Dynamic Programming)的理解:从穷举开始(转)

    转自:http://janfan.cn/chinese/2015/01/21/dynamic-programming.html 动态规划(Dynamic Programming,以下简称dp)是算法设 ...

  6. 动态规划(Dynamic Programming)算法与LC实例的理解

    动态规划(Dynamic Programming)算法与LC实例的理解 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Le ...

  7. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  8. 动态规划Dynamic Programming

    动态规划Dynamic Programming code教你做人:DP其实不算是一种算法,而是一种思想/思路,分阶段决策的思路 理解动态规划: 递归与动态规划的联系与区别 -> 记忆化搜索 -& ...

  9. 最优化问题 Optimization Problems & 动态规划 Dynamic Programming

    2018-01-12 22:50:06 一.优化问题 优化问题用数学的角度来分析就是去求一个函数或者说方程的极大值或者极小值,通常这种优化问题是有约束条件的,所以也被称为约束优化问题. 约束优化问题( ...

随机推荐

  1. ROS的工作模式和ESXI网卡工作模式的关系

    1.ROS网卡如果工作在桥接模式,那么ESXI网卡的工作模式必须设置为Promiscuous Mode(混杂模式)和Forged Transmits(伪传输)这两个必须都为开启状态,如下: 这种情况, ...

  2. [UE4]多播代理

    1. 第一种 DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FReceiveDelegateEvent, FString, Value1, FString, ...

  3. 学习MongoDB 四: MongoDB查询(一)

    一.简介 MongoDB提供了db.collection.find() 方法可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段. 二.db.collection.fi ...

  4. 浅谈forword和sendRedirect

    最近项目中全部用ajax请求数据,导致在做登录过滤器时不能重定向,然后仔细翻了翻Forward和sendRedirect,以下内容收集自百度: 1. forward (服务器端作的重定向) 服务器往c ...

  5. 显式锁(三)读写锁ReadWriteLock

    前言:   上一篇文章,已经很详细地介绍了 显式锁Lock 以及 其常用的实现方式- - ReetrantLock(重入锁),本文将介绍另一种显式锁 - - 读写锁ReadWriteLock.    ...

  6. tomcat启动原理

    2018年04月12日 19:55:22 太极小帅帅 阅读数:282   前言 一直在用Tomcat,但是对其启动原理一直没去研究,这里准备去面试,可能会问道.于是总结了下启动原理.完全凭感觉去揣测, ...

  7. hive xml udf

    <store>   <book id="book"><title id="titile">hive</title> ...

  8. redis详解(四)-- 高可用分布式集群

    一,高可用 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响. 停止服务的原因可能由于网卡.路由器.机房.CPU负载过高.内存溢出.自然灾害等不可预期的原 ...

  9. as3 加载库声音报错

    排除法:(依次排序,从简单到难) 1.引用的声音类名与声音链接名字是否一致,可trace声音对象字符串检验 2.引用的声音对象是否不存在 ,可trace声音对象检验 3.最后检验是否当前swf中,其中 ...

  10. windows10配置java开发环境

    一.下载jdk 二.安装jdk路径,这个路径不能包含中文名 三.系统会提示安装jre,安装目录不要是jdk的安装目录,否则会覆盖掉jdk目录下的jre目录 四. .;%JAVA_HOME%\lib;% ...