zoukankan      html  css  js  c++  java
  • 动态规划笔记

    动态规划专题

    思路:

    利用历史记录来避免重复计算,这些历史记录需要用变量来保存

    一般利用一维数组或者二维数组

    步骤

    1. 定义数组元素的含义

    2. 找到数组元素之间的关系式

      1. 递推式子

      例如
      f(n) = f(n-1)+f(n-2)

    3. 初始值

      1. 类似递推公式当中的初始值

    例子

    ⼆、案例详解
    案例⼀、简单的⼀维DP
    问题描述:⼀只⻘蛙⼀次可以跳上1级台阶,也可以跳上2级。求该⻘蛙跳上⼀个n级的台阶总共有
    多少种跳法。
    (1)、定义数组元素的含义
    按我上⾯的步骤说的,⾸先我们来定义dp[i] 的含义,我们的问题是要求⻘蛙跳上n 级的台阶总共由多
    少种跳法,那我们就定义dp[i] 的含义为:跳上⼀个i 级的台阶总共有dp[i] 种跳法。这样,如果我们能
    够算出dp[n],不就是我们要求的答案吗?所以第⼀步定义完成。
    (2)、找出数组元素间的关系式
    我们的⽬的是要求dp[n],动态规划的题,如你们经常听说的那样,就是把⼀个规模⽐较⼤的问题分成
    ⼏个规模⽐较⼩的问题,然后由⼩的问题推导出⼤的问题。也就是说,dp[n] 的规模为n,⽐它规模⼩
    的是n-1, n-2, n-3.... 也就是说,dp[n] ⼀定会和dp[n-1], dp[n-2]....存在某种关系的。我们要找出他们
    的关系。
    那么问题来了,怎么找?
    这个怎么找,是最核⼼最难的⼀个,我们必须回到问题本身来了,来寻找他们的关系式,dp[n] 究竟会
    等于什么呢?
    对于这道题,由于情况可以选择跳⼀级,也可以选择跳两级,所以⻘蛙到达第n 级的台阶有两种⽅式
    ⼀种是从第n-1 级跳上来
    ⼀种是从第n-2 级跳上来
    由于我们是要算所有可能的跳法的,所以有dp[n] = dp[n-1] + dp[n-2]。
    (3)、找出初始条件
    当n = 1 时,dp[1] = dp[0] + dp[-1],⽽我们是数组是不允许下标为负数的,所以对于dp[1],我们必须
    要直接给出它的数值,相当于初始值,显然,dp[1] = 1。⼀样,dp[0] = 0.(因为0 个台阶,那肯定是
    0 种跳法了)。于是得出初始值:
    dp[0] = 0. dp[1] = 1. 即n <= 1 时,dp[n] = n.
    三个步骤都做出来了,那么我们就来写代码吧,代码会详细注释滴。
    

    总结

    填表过程,记住当前二维数组的意义以及原来数组中的当前位置的意义

  • 相关阅读:
    5 float f = 3.4,是否正确
    4 String是基本数据类型吗
    3 访问修饰符public,private,protected以及不写(默认)时的区别
    1 请谈谈面向对象的三大特征?
    接口和抽象类有什么区别
    2 Java中 == 和 equals 和 hashCode 的区别
    java中重载(overload)与重写(override)的区别
    servlet中请求转发(forword)和重定向(redirect)的区别
    团队-项目名称五子棋-团队一阶段互评
    团队-项目名称五子棋-开发环境搭建过程
  • 原文地址:https://www.cnblogs.com/albertshine/p/13616813.html
Copyright © 2011-2022 走看看