Dp通用套路(闫式)

闫式dp分析法:

从集合角度来分析DP问题。

核心思想:

DP是一种求有限集中的最值或者个数问题

由于集合中元素的数量都是指数级别的,直接用定义去求,把每种方案都用dfs暴力枚举一遍,时间复杂度很高,此时用DP问题去优化。

DP 优化两个阶段(核心思想)

 动态规划解题步骤

步骤一:确定集合以及集合的属性

将问题看成一个集合,按照上述集合划分依据,分成若干不同子集。

按照属性定义状态,例如用 f[i] 表示考虑前 i 个元素时的某种最优解或状态。

​步骤二: 状态计算

找出状态之间的关系,即状态转移方程。这个方程描述了如何从已知子集的解构建出整个集合的解。​

步骤三:确定初始值

确定基本情况或边界条件。这些是状态转移方程中无法通过递推得到,需要直接给出的值。有时候可以直接将f数组定义为全局数组,则数组的元素会被默认初始化为0。​

例如f[0] = 0 ,表示容量为0时的最大价值为0。​

步骤四:输出结果

根据问题的要求,输出最终结果。在很多情况下,最终结果存储在 f[n] 中,其中 n 是问题的规模。​

eg:01背包问题

分析:

从2的n次方个方案中,找到总价值最大的方案,即有限集合中的最值问题,用闫式DP分析法来做。

分别求出左边的最大值,右边集合的最大值,两边取max,就是f(i,j) 的值

左边=f(i-1,j)

右边:每个方案都包含i,不变,要想值最大,需要前面变化的(1~i-1)部分最大

朴素代码

 优化空间后的代码

DP问题所有的优化都是对代码做等价变形

等价变形过程如下

 由上图分析可得,与原方程不等价。为了使之等价,可以将内层倒序循环(由大到小循环),这样fj会比这件f(j-vi)先更新,那么此时用到的j-vi一定是上一层的,即第i-1层。

继续优化,删掉恒等式f[j]=f[j]等得到优化结果

注意:

必须保证代码优化后是等价的 

内层循环:遍历每个可能的容量是为了计算在不同容量限制下的最大价值,确保我们考虑了所有可能的容量。因为在考虑第i个物品是否放入背包的时候,我们需要用当前背包的容量减去第i个物品的体积,而第i个物品的体积是任意的,因此我们需要考虑第i个物品在所有可能的容量限制下的最大价值,从而能够通过比较放入和不放入当前物品时的价值计算出在每个容量下的最大价值。

eg2:完全背包

闫式DP分析问题

 朴素代码

优化空间后的代码

按照01背包问题的方法做等价变形过程如下

 如图,恰好等价

继续优化,删掉恒等式f[j]=f[j],将判断条件放到内层循环初始化里,因为不满足这个条件的部分会被直接跳过。

得到代码

两个问题状态转移方程如下

eg3:石子合并(区间DP问题)

分析

第一次可以选择合并的堆数是n-1,因为一共有n排,选择的相邻堆一共n-1种选法。第二次合并的时候,就剩下n-1堆,相邻两堆的个数只剩下了n-2,所以第二次合并的时候只剩下了n-2种选法,以此类推,所有不同的合并顺序一共有(n-1)!种。

满足有限集,方案很多,可以考虑DP

由分析可知,最后合并的时候一定是把左边的某一段和右边的某一段合并,因此可以分界点作为划分的依据,具体来说可以以左半边连续一段的最后一堆,如上图,最后一堆可以在第i个位置,以此类推。但至少要有两堆,所以左边这一堆最大到j-1,因此可以分成上面的j-i类。

现在只要把每一类求出来取一个min,即每个子集的min,再从这些min中取出一个最小值,就是整个集合的最小值。

最终的f[i][j]枚举k,从i到j-1 ,在里面取一个min即可。

代码

区间dp问题:先枚举区间长度,再枚举区间左端点,若区间长度为1,不用合并,所以从长度2开始枚举。

因为要在区间长度一定的情况下,在同一[i,j]区间枚举所有k的可能取值中最f[i][j]的最小值,可以先让f[i][j]等于一个正无穷,然后再枚举k

f[i][j]含义:所有将[i,j]区间合并成一堆的方案的集合中的最小值。

总体思想:把这一排石子看成一个集合,然后枚举所有可能的区间当成一个子集。在每个区间中把石子分成左右两堆,K为左右两堆的分界点,每一次枚举k,都要更新当前区间合并石子的最小值。最终根据f数组的含义,f[1][n]即为答案。

eg3:最长公共子序列

子串要求连续,子序列只要求相对顺序。

一个长度为n的序列,据每个数是在或不在这个子序列两种情况,所以一共有2的n次方个不同的子序列。暴力枚举一定会超时,所以用dp来做。

分析

按照最后一个不同点划分:第一个字符串的最后一个字符a[i]是否包含在这个子序列里,第二个字符串的最后一个字b[j]是否包含在这个字序列里来划分。a[i]和b[j]是否包含各有两种选择,所以一共是四种选择。用0表示不包含,1表示包含,前面的代表a[i],后面的代表b[j],四种情况如上图

对于11这种情况,只有a[i]=b[j]时才存在

对于01这种情况,f(i-1, j) 不一定会存在 bj,但已经考虑了含概 bj 可能中的最大值,虽然不含 ai 和 bj 已经在 00 中考虑了,这里就是重复,求最大最小值,重复考虑是没问题的,但是求和的时候不能重复考虑。

同理,对于10这种情况,重复考虑也是没问题。

f[i][j]含义:所有序列a[1~i]与序列b[1~j]的公共子序列的集合中,最长公共子序列的长度。

因此,f[n][m]即为最终答案。

代码

最后

我们要相信科学,不要相信玄学。

如果上述解释有不对的地方,欢迎大家指正

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

33、前台搜索功能怎么实现?

输入搜索的东西,如果为空 如果有 前端是提交表单,方式是 post 后端接受 调用 mybatisplus的categoryService.getById 用户在搜索框内输入关键字之后,执行 js 中的 load方法,前端提交表单, 后端 controller 中的loa…

Spring Boot 框架概述

1. 简介 Spring Boot 是由 Pivotal 团队开发的一个用于简化 Spring 应用开发的框架。它通过提供默认配置、嵌入式服务器和自动配置等特性,让开发者能够更快速地构建独立的、生产级别的 Spring 应用。 Spring Boot 的主要特点包括: 快速创建独立的 Spri…

机器学习第二讲:对比传统编程:解决复杂规则场景

机器学习第二讲:对比传统编程:解决复杂规则场景 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:超详细手把手指南 一、场景…

Jackson Databind

Jackson Databind 是 Java 生态中处理 JSON 数据的核心库之一,主要用于实现 Java 对象与 JSON 数据之间的序列化与反序列化。它是 Jackson 库家族的一部分,通常与 jackson-core 和 jackson-annotations 一起使用,共同完成 JSON 处理任务。 核…

MySQL 中的事务隔离级别有哪些?

MySQL 支持四种标准的事务隔离级别,从低到高依次为:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ) 和 串行化(SERIALIZABLE&#x…

RAG优化知识库检索(1):基础概念与架构

1. 引言 大语言模型(LLM)常常面临着知识时效性、幻觉生成、定制化难等挑战,检索增强生成(Retrieval-Augmented Generation, RAG)技术作为解决这些问题的有效方案,正在成为AI应用开发的标准架构。 本文将从基础概念入手,全面介绍RAG技术的核心原理、标准架构与组件,以及评…

安卓工程build.gradle中的Groovy的常见知识点

文章目录 变量定义函数定义函数调用闭包参数APK输出配置多channel配置依赖配置关键总结常见混淆点groovy高度兼容java 变量定义 def debugCdnUrl "\"http://xxx\"" //变量赋值函数定义 def getTime() { // 函数定义(def 是 Groovy 中定义变…

阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化

作者:裘文成(翊韬) 摘要 随着企业全球化业务的扩展,如何高效、经济且可靠地将分布在海外各地的应用与基础设施日志统一采集至阿里云日志服务 (SLS) 进行分析与监控,已成为关键挑战。 本文聚焦于阿里云高性能日志采集…

deep seek简介和解析

deepseek大合集,百度链接:https://pan.baidu.com/s/10EqPTg0dTat1UT6I-OlFtg?pwdw896 提取码:w896 一篇文章带你全面了解deep seek 目录 一、deep seek是什么 DeepSeek-R1开源推理模型,具有以下特点: 技术优势: 市场定位&…

在ISOLAR A/B 工具使用UDS 0x14服务清除单个DTC故障的配置

在ISOLAR A/B 工具使用UDS 0x14服务清除单个DTC故障的配置如下图所示 将DemClearDTCLimitation参数改成DEM_ALL_SUPPORTED_DTCS 此时0x14 服务就可以支持单个DTC的故障清除, 如果配置成 DEM_ONLY_CLEAR_ALL_DTCS 则只能够用0x14服务清楚所有DTC。

Redis面试 实战贴 后面持续更新链接

redis是使用C语言写的。 面试问题列表: Redis支持哪些数据类型?各适用于什么场景? Redis为什么采用单线程模型?优势与瓶颈是什么? RDB和AOF持久化的区别?如何选择?混合持久化如何实现&#x…

Selenium自动化测试工具常见函数

目录 前言 一、什么是自动化? 二、元素的定位 三、测试对象的操作 3.1输入文本send_keys() 3.2按钮点击click() 3.3清除文本clear() 3.4获取文本信息text 3.5获取页面的title与URL 四、窗口 4.1窗口的切换switch_to.window() 4.2窗口大小设置 …

seata 1.5.2 升级到2.1.0版本

一、部署1.5.2 1、解压缩 tar -xvf apache-seata-***-incubating-bin.tar.gz 2、修改conf下的application.yml 只需要修改seata下的此配置,然后再nacos中添加其它配置,下面是application.yml的配置: server:port: 7091spring:applic…

Vue知识框架

一、Vue 基础核心 1. 响应式原理 数据驱动:通过 data 定义响应式数据,视图自动同步数据变化。 2、核心机制 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)实现数据劫持。依赖收集:追踪…

Nginx静态资源增加权限验证

Nginx静态资源增加权限验证 一、前言二、解决思路2.1、方式一2.2、方式二三、代码3.1、方式一3.1.1、前端代码3.1.2、后端代码3.1.3、Nginx调整3.1.4、注意事项3.2.方式二四、参考资料一、前言 在项目开发的过程中,项目初期,及大部分小型项目都是使用共享磁盘进行静态文件的…

分析NVIDIA的股价和业绩暴涨的原因

NVIDIA自2016年以来股价与业绩的持续高增长,是多重因素共同作用的结果。作为芯片行业的领军企业,NVIDIA抓住了技术、战略、市场与行业趋势的机遇。以下从技术创新、战略布局、市场需求、财务表现及外部环境等维度,深入分析其成功原因&#xf…

更换芯片后因匝数比变化,在长距离传输时出现通讯问题。我将从匝数比对信号传输的影响、阻抗匹配等方面分析可能原因,并给出相应解决方案。

匝数比影响信号幅度与相位:原 HM1188 芯片匝数比 1:1,信号在变压器原副边传输时幅度基本不变;更换为 XT1188 芯片(匝数比 1:2)后,根据变压器原理,副边输出信号幅度会变为原边的 2 倍。短距离 10…

Python引领前后端创新变革,重塑数字世界架构

引言:Python 在前后端开发的崭新时代 在当今数字化时代,软件开发领域持续创新,而 Python 作为一门功能强大、应用广泛的编程语言,正引领着前后端开发的变革浪潮。Python 以其简洁易读的语法、丰富的库和框架生态系统,以及强大的跨领域适用性,在计算机领域占据了举足轻重…

IP SSL证书常见问题助您快速实现HTTPS加密

一、什么是IP SSL证书? IP SSL证书是一种专门用于保护基于IP地址的网站或服务器的SSL证书。与传统的域名SSL证书不同,它不需要绑定域名,而是直接与公网IP地址关联。当用户访问该IP地址时,浏览器与服务器之间会建立加密连接&#…

「Mac畅玩AIGC与多模态27」开发篇23 - 多任务摘要合成与提醒工作流示例

一、概述 本篇基于兴趣建议输出的方式,扩展为支持多任务输入场景,介绍如何使用 LLM 对用户输入的多项待办事项进行摘要整合、生成重点提醒,并保持自然语言风格输出,适用于任务总结、进度引导、日程提醒等轻量型任务生成场景。 二…