一文学会动态规划

2023-11-13

系列文章目录

注意
在学习理论之前,希望读者能看如下几个例子,有助于理解

《算法导论》学习(十七)----动态规划之钢条切割(C语言)
《算法导论》学习(十八)----动态规划之矩阵链乘(C语言)
《算法导论》学习(十九)----动态规划之最长公共子序列(C语言)



前言

本文主要讲解了动态规划的理论知识,表明动态规划的使用场景,分析了它的具体逻辑,给出了理论操作具体步骤。


一、动态规划

1.使用场景

(1)什么是动态规划

动态规划是一种用来解决一类最优化问题的编程方案,往往可以将指数时间代价的问题在多项式时间代价下解决,而这类最优化问题由如下特征:

  • 某一级的最优化问题总是可以用比低级的同类子问题来描述,称为最优子结构
  • 一般情况下,解决第n级的子问题和解决第m级的子问题的时候,都会需要解决第k级的问题(n>k,m>k),称为重叠子问题
  • 如果解决该问题采用暴力求解(就是遍历所有情况得到最优解的方案),往往时间代价是指数级的

(2)动态规划与分治策略的对比

分治策略是一种很普遍的程序设计方法,在初学的时候感觉它们有很大的相似性,难以区分,因此特别在此作出区分,希望能帮助有困惑的读者

注:想了解分治策略的读者可以参考下面的文章:
《算法导论》学习(三)---- 最大和子数组问题的分治方法
《算法导论》学习(五)---- 分治策略(递归)的时间复杂度求解

动态规划与分治的对比大致如下:

  • 都采用了用子问题来解决总问题的编程思路
  • 分治算法会采用固定的分割方式来切割问题成子问题,而动态规划的子问题切割方案由是否最优来决定,因此动态规划往往需要存储子问题的切割方式
  • 分治算法的往往采用递归的方法,设计算法是从上到下分割子问题的思路;动态规划往往采用自底向上的解决方案,即从最小的子问题开始向上解决,往往采用多层循环的方式
  • 动态规划需要存储所有的子问题的解,但是有的子问题的解对最终结果是基本没有作用的(如果忽略子问题间的比较以得到最优值这个过程);分治策略中每一个子问题的解都会对最终结果的产生有或多或少的影响。因此动态规划解决的问题的时间代价一般比较大(纯个人见解,不一定正确)
  • …(不妥之处大家请于评论区指出)

2.核心要素分析

(1)最优子结构

什么是最优子结构?

最优子结构就是指:一个问题的最优解包含它的子问题的最优解

构建结构

最优子结构的构建步骤如下:

  • 1.查看一个最优问题的解能不能用它的子问题一层一层地描述出来
  • 2.选择一种切割方案
  • 3.确定该方案需要哪些子问题来解决一个问题,包括子问题的个数和层级
  • 4.最后计算:得到最优切割方案所需要的遍历的情况数

(2)重叠子问题

什么是重叠子问题?

重叠子问题一般指:几个子问题的解决往往都需要用到相同的层级偏低的子问题。通俗的来讲,就是循环程序会重复解决一些子问题

问题解决

采用自底向上的解决结构

  • 先从最小的子问题开始解决,然后将解存入存储矩阵,之后再需要用到已解决的子问题时们直接访问存储好的最优解即可

3.操作步骤

(1)刻画问题特征

  • 首先就是要明确问题的特征是否包含两个特点:最优子结构与子问题重叠,如果满足两点,就可以考虑使用动态规划的解决方案
  • 解读问题的条件和目的,看看能不能构造出最优子结构。构造最优子结构的步骤见上
  • 如果可以构造出最优子结构,那么就要在模糊的方案上添加逻辑细节,保证所有情况下,都可以用该最优子结构方案解决好问题

(2)构建递归解

  • 根据上一步编写好的完善的最优子结构方案,来写出它的数学公式
  • 设计一些存储变量,使得递归公式得以运行。比如存储子问题最优解的存储单元
  • 明确各个逻辑条件

(3)编写算法

首先申明存储变量,主要有存储子问题解和存储分割方案的存储单元
设计循坏方案,需要自底向上的逻辑结构
返回最优值

(4)构造最优解

  • 通过切割方案的存储矩阵,获取每一次分割的方案
  • 设计递归结构,可以用递归树的方案来设计具体的细节
  • 明确具体要打印的一些数据

总结

文章的不妥之处请各位读者包涵指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文学会动态规划 的相关文章

  • sh: 1: webpack-dev-server: Permission denied

    npm run dev一个项目时出现了如标题的错误 提示权限错误 我没有安装webpack dev server这个模块 也不知道之前有没有安装webpack 索性一块安装 命令行全局安装webpack webpack dev server
  • App自动化测试

    windows下搭建python appium环境 搭建过程步骤如下 安装jdk并配置好环境变量 jdk版本1 8以上 安装android sdk并配置好环境变量 具体步骤见 Android Studio安装 推荐使用这种方法安装SDK 环

随机推荐

  • 华硕P10S-M主板组装服务器-raid配置方法

    组装服务器磁盘阵列 阵列卡型号 P10S M 打开BIOS界面 选择Advanced 找到SATA Mode Selection选项 选择RAID磁盘阵列选项 保存后重启 开机界面按CTRL I进入磁盘阵列卡配置界面 进入磁盘阵列 进入Cr
  • Python入门(一)·环境配置与python基础

    这篇博客记录我的python入门学习过程 使用阿里云服务器ubuntu 18 04 关于Linux的入门参照上一篇博客 学习使用的视频来自B站 黑马程序员python教程 python简介 它是作者基于C语言编辑的解释器 最大的优点是开源得
  • BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)

    一 简介 Java在java math包中提供的API类BigDecimal 用来对超过16位有效位的数进行精确的运算 双精度浮点型变量double可以处理16位有效数 在实际应用中 需要对更大或者更小的数进行运算和处理 float和dou
  • 推荐一款微软出品的开发神器,体验不输IDEA!

    最近微软的开发工具VSCode频繁更新Java支持 又是支持SpringBoot 又是支持Lombok 让我不禁好奇VSCode是不是也能胜任Java开发了 于是抽空体验了一把 确实完全可以胜任 Java开发者又有了新选择 不仅好用而且开源
  • 深度学习------CNN实现验证码和猫狗数据集

    1 卷积神经网络基本操作 import tensorflow as tf import numpy as np import os import matplotlib pyplot as plt import random def read
  • AI标注工具Labelme和LabelImage Labelme和LabelImage集成工具

    在AI数据标注过程中 难免会使用到标注工具 常用的工具无非是Labelme和LabelImage Labelme是标注目标轮廓 而LabelImage则是标注目标的区域 然而使用原生态的工具 需要用到python命令行 十分麻烦 为了方便大
  • C++ ——Qt的信号和槽的详解

    1 概述 信号槽是 Qt 框架引以为豪的机制之一 所谓信号槽 实际就是观察者模式 当某个事件发生之后 比如 按钮检测到自己被点击了一下 它就会发出一个信号 signal 这种发出是没有目的的 类似广播 如果有对象对这个信号感兴趣 它就会使用
  • pycharm安装需要java_安装pycharm遇到的坑

    第三周开始接触python了 结果第一步装pycharm时就遇到了坑 正常安装完成后点运行时出现错误 No JVM installation found 助教说这是缺少jdk java程序支持包 需要在网上找个最新的安装并配置下path路径
  • 【第24篇】CenterNet2论文解析,COCO成绩最高56.4mAP

    文章目录 摘要 1 简介 2 相关工作 3 准备工作 4 两阶段检测的概率解释 5 构建一个概率两级检测器 6 结果 6 1 消融研究 6 2 大词汇检测 七 结论 摘要 https arxiv org abs 2103 07461 我们开
  • 开源License的类型

    如今 Stallman率先推出的GPL已经进入到第三个版本 GNU GPLv3 且这只是几十种开源License类型中的一种 开源组织OSI 是一个在1998年成立的 为了推广开源程序和规范术语使用的组织 它已经批准了80多种开源许可证 这
  • JS数组方法&&es5数组新增方法

    1 unshift 给数组的开头添加一个或多个元素 数组名 unshift 一个值或多个值 返回添加以后的新数组的长度 2 push 给数组的末尾添加一个或多个元素 数组 push 一个值或多个值 返回新数组的长度 3 shift 给数组的
  • C++的Json库的简单实现

    我的Json库实现 Json 实现Json 我的源码 点这里 https github com jo qzy MyJson 和效果图 Json库中的类实现 JSON Value类 JSON Reader JSON Writer FastWr
  • 第十二章 Ambari二次开发之集成Alluxio

    1 Alluxio高可用部署 生产环境 使用具有高可用性的模式来运行Alluxio masters 1 1 Alluxio架构 Alluxio可以被分为三个部分 masters workers以及clients 一个典型的设置由一个主服务器
  • MySQL 过滤重复数据

    方法1 加关键字 DISTINCT 在mysql中 可以利用 SELECT 语句和 DISTINCT 关键字来进行去重查询 过滤掉重复的数据 语法 SELECT DISTINCT 字段名 FROM 数据表名 DISTINCT 关键字的语法格
  • HTML+CSS+JavaScript写计算器

    思维导图 代码 HTML div div div div div div
  • TestNg多线程—— 并行执行测试

    多线程并行执行测试 可以通过参数设置来实现不同级别的多线程配置测试 1 test级别的多线程测试 每个
  • 第二章:25+ Python 数据操作教程(第十八节如何使用 Matplotlib 库在 python 中执行绘图和数据可视化)持续更新中

    本教程概述了如何使用 Matplotlib 库在 python 中执行绘图和数据可视化 这篇文章的目的是让您熟悉该库的基础知识和高级绘图功能 它包含几个示例 将为您提供使用 Python 生成绘图的实践经验 目录 什么是 Matplotli
  • phpshe v1.7漏洞复现(Sql injection+XXE)

    前几天研究了一下xss的绕过 这两天准备深入研究下sql注入的审计 首先自动审计一波 看到疑似的一个变量覆盖点 点进去看原来是 register globals的隐患消除 简单来说如果这个配置设置为On的话 从客户端传输过来的任意参数值会被
  • jboss 热部署

    文章目录 JBoss EAP 6 4 0 GA AS 7 5 0 Final redhat 21 JBoss EAP 6 4 0 GA AS 7 5 0 Final redhat 21
  • 一文学会动态规划

    系列文章目录 注意 在学习理论之前 希望读者能看如下几个例子 有助于理解 算法导论 学习 十七 动态规划之钢条切割 C语言 算法导论 学习 十八 动态规划之矩阵链乘 C语言 算法导论 学习 十九 动态规划之最长公共子序列 C语言 文章目录