zoukankan      html  css  js  c++  java
  • 动态规划(DP)笔记(一): 简介


    基本术语:

    • 阶段:将求解问题的过程分为若干个相互联系的阶段

    • 状态:状态表示每个阶段开始棉铃的自然状况和客观条件

    • 决策:从当前状态转移至下一状态

    • 策略:一系列决策的组合

    • 边界:初始集合

    1. 状态设计:

      1.1 阶段划分:将原问题划分为若干个不相交的部分,每部分称为一个阶段。

      1.2 状态设计:设计信息来描述当前阶段的各个不同情况,这些不同的情况称为状态,信息则是状态的表示。

    2. 决策:决策是从当前状态转移至不同的状态,决策与状态构成一个有向无环图(DAG)


    动态规划的性质:

    • 最优子结构:一个最优化的策略,其子策略总是最优的,反过来也可以通过最优子策略推出最优策略。

    • 无后效性:当前决策只与当前状态有关,与之前的决策无关。

    • 子问题重叠:算法在计算过程中会反复求解一定量的相同的子问题,而不是不断生成新的子问题。也就是说子问题空间不大,或者是状态空间不大,可以通过存储状态的答案加速计算过程。


    动态规划题目特点:

    • 最值

    • 计数

    • 存在性判定(相当于计数是否大于0)


    动态规划的实现方式:

    • 记忆化搜索:记忆化搜索是比较简单的实现方式,通过数组存储不同状态的答案,当搜索某一状态时,若已经计算过就直接返回,否则向下搜索并存储计算到的答案。

      优点:
      · 能避免无用状态答案的计算
      · 边界问题易于考虑
      · 易于思考,无需考虑状态的计算顺序
      · 可以使用搜索算法的优化技巧

    • 递推:利用 for 循环进行状态的枚举更新,需要推导状态转移方程。

      优点:
      · 可以加入动态规划优化
      · 没有记忆搜索的递归栈开销,速度快


    解决步骤小结:

    1. 确定状态表示,包含阶段划分和状态表示
    2. 写出转移方程
    3. 确定边界:初始的情况
    4. 如果使用递推,需要考虑状态枚举的顺序

    参考

    动态规划 – Introduction
    本文是基于该博客的笔记,更详细的内容可以在上述链接查看。
    这位博主的B站也有配套的视频讲解,我是觉得讲得特好!

  • 相关阅读:
    Kibana详细入门教程
    Python爬取食品商务网蔬菜价格数据,看看蔬菜最近的价格情况
    用Python爬取某蔬菜网的行情,分析底哪个地区的蔬菜便宜
    ES启动失败;java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.c
    ELK 5.0 组件后台启动
    linux中/etc/security/limits.conf配置文件说明
    redis面试常见问题
    单线程的Redis为什么能支持10w+的QPS?
    Redis大Key优化
    redis中查找大key方法汇总
  • 原文地址:https://www.cnblogs.com/joe-w/p/12323041.html
Copyright © 2011-2022 走看看