数据结构-动态规划策略

  • 动态规划

    • 1.理解动态规划思想

      • 基本概念
        • 重叠子问题:原问题可以分解为若干个子问题,且这些子问题之间存在重复部分。也就是说,为了解决一个子问题,我们需要多次求解相同的子子问题。例如,在计算斐波那契数列时,计算第n项需要知道第n-1项和第n-2项,而计算第n-1项又需要知道第n-2项和第n-3项,如此反复,子问题被反复计算。
        • 最优子结构:原问题的最优解可以通过其子问题的最优解构造出来。这意味着,要找到整个问题的最优解,必须先确定子问题的最优解。例如,在求解最短路径问题时,从起点到终点的最短路径必然包含从起点到某个中间节点的最短路径。
      • 核心思想
        • 主要用于解决具有重叠子问题和最优子结构性质的问题。动态规划的核心思想是将原问题分解为相互重叠的子问题,并通过自底向上或自顶向下的方式逐步求解子问题,存储并利用已计算过的子问题结果(称为“状态”或“阶段”),避免重复计算,从而高效地求得原问题的最优解。
    • 2.算法实现过程(状态与状态转移方程)

      • 状态的定义:明确问题中的状态变量及其取值范围。状态通常代表了问题在某一阶段或某一时刻的具体情况。
      • 状态转移方程:建立状态之间的递推关系,即如何从一个或多个较小规模的子问题状态计算出当前状态的值。这是动态规划的核心步骤,它确保了问题的求解能够以自底向上或自顶向下的方式进行。
      • 边界条件:确定递归过程的终止条件或初始状态值。这通常是问题规模最小或没有子问题时的状态值。例如,在斐波那契数列中,边界条件为 F(0) = 0 和 F(1) = 1。
    • 3.动态规划实现方式

      • 记忆化搜索(自顶向下)
        1. 编写递归函数,遵循“先调用后计算”的原则,同时在函数内部添加缓存(如哈希表或数组),存储已计算过的子问题结果。
        2. 在每次递归调用时,首先检查缓存中是否存在对应子问题的解,若存在则直接返回;若不存在,则计算该子问题的解并将其存入缓存,再返回结果。
      • 迭代法(自底向上)
        • 使用循环结构遍历状态空间,按照问题规模从小到大的顺序,依次计算所有子问题的解。
        • 根据状态转移方程,利用已计算好的较小规模子问题的解来更新当前状态的值。
        • 将每个子问题的解保存在一个表格(如二维数组)中,便于后续访问。
    • 4.动态规划的适用条件

      • 最优子结构
        • 问题的最优解包含其子问题的最优解。换句话说,要找到原问题的最优解,必须先确定其子问题的最优解。这意味着,问题的最优解可以通过组合子问题的最优解来构建,而无需考虑非最优的子问题解。
      • 重叠子问题
        • 在解决问题的过程中,相同的子问题会被多次遇到和求解。如果不采取措施避免重复计算,这种重复会导致不必要的计算开销,降低算法效率。
        • 动态规划通过保存已经计算过的子问题结果,避免了对同一子问题的重复求解,从而提高了效率。例如,在计算斐波那契数列时,计算第n项需要知道第n-1项和第n-2项,而计算第n-1项又需要知道第n-2项和第n-3项,如果没有缓存先前的结果,就会出现大量的重复计算。
      • 无后效性
        • 当前状态的决策只依赖于当前状态本身及之前的状态,而不依赖于未来状态或之后的决策。也就是说,一旦确定了一个状态的值,未来的决策不会影响这个状态值的变化。
        • 无后效性保证了状态转移过程的确定性,使得我们可以放心地根据当前状态计算下一个状态,而不需要担心未来决策会反过来影响当前状态的计算。
    • 5.动态规划的时间复杂度分析

      • 状态空间大小
        • 状态数(n):问题中可能存在的不同状态的数量。这通常由状态变量的取值范围决定。例如,在经典的0/1背包问题中,状态变量可能包括物品编号和背包剩余容量,状态数随物品数量和背包容量的不同而变化。
        • 状态维度(d):问题中的状态变量个数。单变量问题通常对应一维状态空间,多变量问题则对应多维状态空间。状态维度会影响状态转移所需的计算次数。
      • 状态转移次数
        • 状态转移方程:分析状态转移方程以确定计算一个状态值所需的状态转移次数。这通常涉及到对状态空间中相邻状态(或相关状态)的访问次数。
        • 循环结构:如果使用迭代法(自底向上)实现,可以通过分析循环结构来确定状态转移次数。例如,双层循环通常对应状态转移次数为 O(n^2),三层循环则可能对应 O(n^3)。
      • 状态转移复杂度
        • 单次转移操作:计算一个状态值所需的基本操作次数。
        • 总转移复杂度:将单次转移操作的复杂度乘以状态转移次数,得到总的转移复杂度
      • 边界条件处理
        • 初始化时间:处理边界条件所需的时间,通常为常数时间或与状态空间大小成线性关系。
        • 结果提取时间:从最终状态或状态表中提取最终答案所需的时间,同样通常为较低阶复杂度。
      • 总体时间复杂度
        • 动态规划算法的总体时间复杂度通常由上述各部分复杂度的最高阶项决定。
    • 6.典型动态规划问题

      • 最长上升子序列
        • 问题描述:给定一个整数序列,找到其中最长的严格递增子序列(子序列中的元素严格递增,且不一定是连续的)的长度。
        • 动态规划思想
          • 状态定义:设 dp[i] 表示以原序列中第 i 个元素结尾的最长上升子序列的长度。
          • 状态转移:对于每个位置 i,考虑其前面所有较小的元素(A[j],j < i),若存在 A[j] < A[i],则以 A[i] 结尾的最长上升子序列长度至少为 dp[j] + 1。取所有这样的 dp[j] + 1 中的最大值作为 dp[i] 的值。
          • 动态规划方程:dp[i] = max(dp[j] + 1),其中 j 满足 0 <= j < i 且 A[j] < A[i]。
      • 0-1背包问题
        • 问题描述:给定一组物品,每种物品有一个重量 w_i 和一个价值 v_i,以及一个背包的容量 W。要求在不超过背包容量的前提下,选择物品放入背包,使得背包中物品的总价值最大。
        • 动态规划思想
          • 状态定义:设 dp[i][w][i][w]表示考虑前 i 件物品,背包容量为 w 时可以获得的最大价值。
          • 状态转移:对于每个物品 i 和背包容量 w,有两种选择:① 不放入物品 i,此时背包价值为 dp[i-1][w];② 放入物品 i,若 w >= w_i,则背包价值为 dp[i-1][w-w_i] + v_i。取两者中价值较大者作为 dp[i][w] 的值。
          • 动态规划方程:dp[i][w] = max(dp[i-1][w], dp[i-1][w-w_i] + v_i),其中 w >= w_i;否则 dp[i][w] = dp[i-1][w]。
      • 最长公共子序列
        • 问题描述:给定两个字符串 str1 和 str2,找到它们的最长公共子序列(子序列中的字符按原顺序排列,且不一定连续)的长度
        • 动态规划思想
          • 状态定义:设 dp[i][j] 表示字符串 str1 前 i 个字符和字符串 str2 前 j 个字符的最长公共子序列的长度。
          • 状态转移:对于每对字符位置 (i, j),若 str1[i-1] == str2[j-1],说明当前i,j字符相同可以加入公共子序列,长度增加1,即 dp[i][j] = dp[i-1][j-1] + 1;否则,选择在 str1 或 str2 中保留更长的子序列,即 dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
          • 动态规划方程:若 str1[i-1] == str2[j-1]),dp[i][j] = dp[i-1][j-1] + 1,否则 dp[i][j] = max(dp[i-\1][j], dp[i][j-1])。
      • 最大子数组之和
        • 问题描述:给定一个整数数组,找到其中具有最大和的连续子数组。
        • 动态规划思想
          • 状态定义:设 dp[i] 表示以原数组中第 i 个元素结尾的连续子数组的最大和。
          • 状态转移:对于每个位置 i,计算以 A[i] 结尾的子数组和,有两种情况:① 包含前一个元素 A[i-1],则子数组和为 dp[i-1] + A[i];② 只包含当前元素 A[i],子数组和为 A[i]。取两者中和较大的作为 dp[i] 的值。
          • 动态规划方程:dp[i] = max(dp[i-1] + A[i], A[i]).其中 i > 0;dp[0] = A[0](初始化)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/557771.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何用个人电脑搭建一台本地服务器,并部署项目到服务器详细教程

服务器是一种高性能计算机&#xff0c;作为网络的节点&#xff0c;它存储、处理网络上80%的数据、信息&#xff0c;因此也被称为网络的灵魂。与普通计算机相比&#xff0c;服务器具有高速CPU运算能力、长时间可靠运行、强大I/O外部数据吞吐能力以及更好的扩展性。 服务器的主要…

【QT进阶】Qt Web混合编程之html、 js的简单交互

往期回顾 【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用&#xff08;图文并茂超详细介绍&#xff09;-CSDN博客【QT进阶】Qt Web混合编程之QWebEngineView基本用法-CSDN博客【QT进阶】Qt Web混合编程之CMake VS2019编译并使用QCefView&#xff08;图文并茂超详细版本&…

NSSCTF Round#22 Reverse个人专项赛 WP

1. ezcrypt&#xff08;史&#xff09; pyinstxtractor.py解包exe&#xff0c;然后pycdc反编译NSSCTF.pyc 得到的源码并不完整&#xff0c;但是重要的部分已经有了&#xff0c;就是一个blowfish加密 但是密钥是crypto.SomeEncode&#xff0c;这并不是字面意义的字符串&#x…

基于弹簧鞘复合纱和迁移学习算法的可穿戴人体重构和智能试衣系统

研究背景 在信息时代和元宇宙的背景下&#xff0c;虚拟服装设计对满足服装行业的个性化需求至关重要。与传统方法不同&#xff0c;虚拟试衣节省时间、方便客户&#xff0c;并提供多样化的款式。准确得测量人体围度并重构出人体的模型是虚拟试衣的关键。为了实现动态人体重构&a…

路径规划 | RRT结合APF算法快速探索随机树结合人工势场法的路径规划算法(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 RRT结合APF算法的matlab代码。地图为可以替换的栅格地图。代码是在复现华中科技大学发表的英文论文的基础上的进一步改进。RRT算法。人工势场算法。 1.原论文方法简介&#xff1a;针对快速探索随机树&#xff08;RRT&…

用 Pytorch 训练一个 Transformer模型

昨天说了一下Transformer架构&#xff0c;今天我们来看看怎么 Pytorch 训练一个Transormer模型&#xff0c;真实训练一个模型是个庞大工程&#xff0c;准备数据、准备硬件等等&#xff0c;我只是做一个简单的实现。因为只是做实验&#xff0c;本地用 CPU 也可以运行。 本文包含…

C++ STL 容器 vector

目录 1. vector 对象2. vector 大小 size 和 容量 capacity3. vector 成员函数3.1 迭代器3.2 容量3.3 元素访问3.4 插入3.5 删除3.6 动态扩充与收缩 4. vector 迭代器失效问题总结其他补充 本文测试环境为 编译器 gcc 13.1 vector 是 STL 中的一个顺序容器&#xff0c;它给我们…

如何将静态网页资源“打包“成.exe或者.apk

Hello , 我是小恒不会java。最近有音乐播放器win桌面应用程序的需求&#xff0c;那就说说上手electron 又想到很多人对apk文件不太了解&#xff0c;apk文件就是安卓桌面应用程序&#xff0c;比如你手机现在打开的微信 当然&#xff0c;exe文件基本都清楚&#xff0c;windows可执…

正则表达式(Regular Expression)

正则表达式很重要&#xff0c;是一个合格攻城狮的必备利器&#xff0c;必须要学会&#xff01;&#xff01;&#xff01; &#xff08;参考视频&#xff09;10分钟快速掌握正则表达式&#xff08;奇乐编程学院&#xff09;https://www.bilibili.com/video/BV1da4y1p7iZ在线测试…

React Hooks(常用)笔记

一、useState&#xff08;保存组件状态&#xff09; 1、基本使用 import { useState } from react;function Example() {const [initialState, setInitialState] useState(default); } useState(保存组件状态) &#xff1a;React hooks是function组件(无状态组件) &#xf…

再拓信创版图-Smartbi 与东方国信数据库完成兼容适配认证

近日&#xff0c;思迈特商业智能与数据分析软件 [简称&#xff1a;Smartbi Insight] V11与北京东方国信科技股份有限公司 &#xff08;以下简称东方国信&#xff09;CirroData-OLAP分布式数据库V2.14.1完成兼容性测试。经双方严格测试&#xff0c;两款产品能够达到通用兼容性要…

浪潮信息成功打造大规模、高性能、高可靠的单存储集群方案!

为帮助企业应对商业智能应用中面临的关于海量数据存储及实时分析的难题&#xff0c;浪潮信息日前通过技术研发&#xff0c;创新推出全球首个SAP HANA集群方案&#xff0c;该方案实现了最大可支持HANA集群服务器节点数量的翻倍&#xff0c;单存储即可支持16节点的&#xff0c;大…

图片高效批量管理,一键批量旋转150度,高效整理您的图片库

在数字化时代&#xff0c;我们的生活中充满了各种图片。从手机拍照到网络下载&#xff0c;从社交媒体到工作文档&#xff0c;图片无处不在。然而&#xff0c;随着图片数量的不断增加&#xff0c;如何高效管理这些图片&#xff0c;让它们有序、易于查找&#xff0c;成为了许多人…

Vue3从入门到实战:深度了解相关API

shallowRef 作用&#xff1a;创建一个响应式数据&#xff0c;但只对顶层属性进行响应式处理。 用法&#xff1a; let myVar shallowRef(initialValue); 特点&#xff1a;只跟踪引用值的变化&#xff0c;不关心值内部的属性变化。 shallowReactive 作用&#xff1a;创建一个…

【MySQL】表的基本约束

文章目录 1、约束类型1.1NOT NULL约束1.2UNIQUE&#xff1a;唯一约束1.3DEFAULT&#xff1a;默认值约束1.4PRIMARY KEY&#xff1a;主键约束1.5FOREIGN KEY&#xff1a;外键约束 2、表的设计2.1一对一2.2一对多2.3多对多 1、约束类型 关键字解释NOT NULL指示某列不能存储NULL值…

点赞列表查询列表

点赞列表查询列表 BlogController GetMapping("/likes/{id}") public Result queryBlogLikes(PathVariable("id") Long id) {return blogService.queryBlogLikes(id); }BlogService Override public Result queryBlogLikes(Long id) {String key BLOG_…

【C++航海王:追寻罗杰的编程之路】C++11(上)

目录 1 -> C11简介 2 -> 统一的列表初始化 2.1 -> {}初始化 2.2 -> std::initializer_list 3 -> 声明 3.1 -> auto 3.2 -> decltype 3.3 -> nullptr 1 -> C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C…

Debian

文章目录 前言一、使用root用户操作二、配置用户使用sudo命令三、添加桌面图标显示1.打开终端2.执行安装命令3.执行成功后重启4. 打开扩展&#xff0c;配置图标 四、图形化界面关闭和打开五、设置静态IP1.查询自己系统网络接口2.修改网络配置文件 总结 前言 Debian 系统在安装…

基于Springboot+Vue的Java项目-在线文档管理系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

RUOYI 若依 横向菜单

保留移动端适配 小屏适配 菜单权限等 可轻松进行深度自定义菜单样式 以及分布 仅支持横向布局 如需源码 教程等 ➕ wx 技术支持 wx : 17339827025
最新文章