【算法】动态规划(dp问题),持续更新

文章目录

  • 0. 动态规划
    • 🎯五个思考步骤 和 注意事项
    • 🎯技巧
    • 优化思路
  • 1. 子数组系列
    • 1.1 乘积为正数的最长子数组长度
    • 1.2 等差数列划分
    • 1.3 最长湍流子数组
    • 1.4 单词拆分
    • 1.5 环绕字符串中的子字符串

0. 动态规划

介绍本篇之前,我想先用人话叙述一般解决动态规划问题的思路:

动态规划的问题,本身有许多产生结果的可能,需要在具体题目下得到满足某个条件的解。

如何得到呢?

我们就需要根据这个具体问题,建立一个状态表(dp 表),在这张 dp 表中的每一个位置的数据都有明确的、相同的定义,称为 状态表示,而储存的每个数据,就是由原问题产生的每一个子问题的解。

子问题的解又该怎么得到呢?

这就需要通过对子问题如何推导(状态的转移过程)进行具体分析,要求是每个解都能由前一个解得到,从而得到所有的子问题的解。根据得到的解把 dp 表填满,最后就能在这张 dp 表中找到我们要的具体答案。

梳理一下:

🎯五个思考步骤 和 注意事项

  • 状态表示:自定义一下 dp 表里的每个数据(子问题的解)有什么统一的含义,就是 dp[i] 是什么
    • dp 表可能是一维数组、二维数组…需要具体分析进行选择
    • 这里的含义需要我们根据题目和经验得出,这里就给大家一个分享一个经验,你可以试着把 i 位置定义成 “以 i 位置为结尾 / 为开头的 xxxx”
  • 状态转移方程:一个通用公式,可以用 最近一步 已知状态推出下一个状态,最终达到填满 dp 表的所有状态(即得到所有子问题的解)
  • 初始化:保证填表时不越界(根据状态转移方程看哪里有越界的可能,再决定怎么初始化)
  • 填表顺序:为了填表时,所需要的状态是已知的
  • 返回值:题目要求 + 状态表示

🎯技巧

  1. 如果 dp[i] 有例如 “选 / 不选” 两种或多种状态,那么建立两个或多个dp表,也可以把几个表写成二维数组
  2. 巧妙利用数组元素和数组下标(尤其是对于 “无序 + 重复” 数据可用)
    • eg:下标对应原数据,元素对应出现个数 / 总合…(见题 1.5)
  3. 画出每种状态的转移方程(状态机),对照图去写 dp 转移方程会更加清楚,不容易出错。
  4. 初始化:
    • 多加一位数 / 一行 / 一列
      • 此种情况需要注意对原数组访问的时候下标还需要多减一位

      • 如果原数组是字符串,可以对原数组加一个虚拟位置(见题1.4),如下

        str = '-' + str;
        
    • 为越界的位置增加一个 if() 判断,会稍微改变一点 dp 转移方程的结构
    • 对于用最大或最小值初始化时会有一个计算后溢出的问题,强烈建议使用这个数据 ±0x3f3f3f3f(int 最大值的一半)
  5. 对于 “环形xx” 想办法转成普通线性关系会简单很多

优化思路

  1. 滚动数组,只留下所需状态求下一个状态,滚动进行。需要注意的是,滚动复制的顺序不能被覆盖。
    ps:此种优化对于算法本身不是很重要,可以作为了解。
  2. 涉及到类似字典搜索,考虑插入后用 hash 表搜索。(见题 1.4)

1. 子数组系列

分析状态时的通用方法:

  1. 分成 自身、自身+之前一个元素 进行具体考虑
  2. 如果题目和数字有关,分成 >0、<0 进行考虑

1.1 乘积为正数的最长子数组长度

🔗详解点击

给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。
一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。
请你返回乘积为正数的最长子数组长度。


1.2 等差数列划分

🔗详解点击

如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。
给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的子数组个数。 子数组是数组中的一个连续序列。


1.3 最长湍流子数组

🔗详解点击

给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 。
如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组
ps: 就是元素两两之间的增长情况是 ↗↘↗↘↗… 这样


1.4 单词拆分

🔗详解点击

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。


1.5 环绕字符串中的子字符串

🔗详解点击

定义字符串 base 为一个 “abcdefghijklmnopqrstuvwxyz” 无限环绕的字符串,所以 base 看起来是这样的:
“…zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd…”.
给你一个字符串 s ,请你统计并返回 s 中有多少 不同非空子串 也在 base 中出现。

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

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

相关文章

MYSQl基础操作命令合集与详解

MySQL入门 先来个总结 SQL语言分类 DDL&#xff08;Data Definition Language&#xff09; - 数据定义语言: 用于定义和管理数据库结构&#xff0c;包括创建、修改和删除数据库对象。 示例&#xff1a;CREATE, ALTER, DROP等语句。 DML&#xff08;Data Manipulation Lan…

常见箱包五金ERP有哪些?箱包五金ERP哪个好用

不同的箱包五金有不同的营销渠道和经营模式&#xff0c;而每一个营销渠道的商品信息维护流程和方式也不尽相同。另外&#xff0c;箱包五金价格制定、品质检验、产品种类、物料编码、批号追踪等环节的管理也比较繁琐。 近些年数字科技也被广泛的应用于箱包五金领域&#xff0c;…

Module ‘app‘: platform ‘android-33‘ not found.

目录 一、报错信息 二、解决方法 一、报错信息 Module app: platform android-33 not found. 检查你的应用程序的build.gradle文件中的targetSdkVersion和compileSdkVersion是否正确设置为已安装的Android SDK版本。 确保你的Android Studio已正确安装并配置了所需的Android …

spring-cloud-starter-gateway-mvc的网关实现

一 概括 最近&#xff0c;我也一直在使用SpringCloudGateway开发我们自己的网关产品。根据我对这份正式文件的理解&#xff0c;内容如下&#xff1a; SpringCloudGateway的默认底层依赖项是SpringWebflux。我们知道Spring Webflux是异步和响应式编程&#xff0c;并且编程范式…

TCP为什么可靠之“拥塞控制”

拥塞控制是对网络层面的控制&#xff0c;主要是为了避免发送方发送过多的数据导致网络阻塞&#xff0c;以及出现网络阻塞时能够调整数据发送速率&#xff0c;达到对网络阻塞的一个控制。 拥塞窗口 拥塞窗口cwnd&#xff0c;是发送方维护的一个状态变量&#xff0c;会根据网络…

Windows 11上边两个空格导致我多熬了1个多小时

将图中的文件路径复制&#xff0c;然后到文件管理器里边去搜索。 发现找不到&#xff0c;可是明明就在这里啊。 我百思不得其解&#xff0c;还以为是IDEA出了问题&#xff0c;我只能是重新启动项目&#xff0c;结果还是告诉我找不到文件。 要是同一个目录下已经有一个名为a…

什么是CORS?如何在PHP中处理CORS问题?

CORS&#xff08;Cross-Origin Resource Sharing&#xff09;是一种机制&#xff0c;它使用额外的 HTTP 头来告诉浏览器是否允许在 Web 页面上访问来自不同域的资源。在默认情况下&#xff0c;浏览器限制跨域请求&#xff0c;以防止潜在的安全风险。CORS 允许服务器指定哪些源&…

【设计模式--行为型--中介者模式】

设计模式--行为型--中介者模式 中介者模式定义结构案例实现优缺点使用场景 中介者模式 定义 又叫调停模式&#xff0c;定义一个中介角色来封装一系列对象之间的交互&#xff0c;使原有对象之间的耦合松散&#xff0c;且可以独立的改变它们之间的交互。 结构 抽象中介者角色…

React中简单实现路由守卫(主要演示其原理)

路由守卫在后台管理系统两种经典的跳转情况&#xff1a; 如果访问的是登录页面&#xff0c; 并且有token&#xff0c; 跳转到首页 如果访问的不是登录页面&#xff0c;并且没有token&#xff0c; 跳转到登录页 其余的都可以正常放行 下面简单实现React路由守卫功能&…

Python学习之复习MySQL-Day2(DML)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;DML介绍添加数据给指定字段添加数据给全部字段添加数据给指定字段添加多条数据给全部字段添加多条数据 修改数据修改指定条件的记录的数据修改全部记录的数据 删除数据 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言…

矩阵理论及其应用邱启荣习题3.5题解

(1) P ( − 1 0 1 − 1 − 1 2 1 1 − 1 ) \begin{pmatrix} -1 & 0&1 \\ -1 & -1&2\\1&1&-1 \end{pmatrix} ​−1−11​0−11​12−1​ ​ A ( 1 0 1 1 1 0 − 1 2 1 ) \begin{pmatrix} 1 & 0&1 \\ 1 & 1&0\\-1&2&1 \end{pmat…

MySQL5.7忘记root密码

1&#xff09;停止mysql服务 systemctl stop mysqld2&#xff09;跳过权限验证启动mysql mysqld --skip-grant-tables --userroot3&#xff09;新开一个shell客户端&#xff0c;直接输入mysql回车就能登陆 [rootlocalhost ~]# mysql Welcome to the MySQL monitor. Commands…

如何培养孩子的自信心

当谈论培养孩子的自信心时&#xff0c;许多家长可能会感到困惑。自信心是一个孩子成长过程中非常重要的品质&#xff0c;它可以帮助孩子在面对挑战时更加勇敢和坚定。那么&#xff0c;如何培养孩子的自信心呢&#xff1f;以下是一些建议&#xff0c;希望能对您有所帮助。 鼓励孩…

git checkout进行更改分支

git clone https://gitee.com/yaleguo1/minit-learning-demo.git下载代码。 cd minit-learning-demo/进入目录里边。 ls -l看一下当前分支的内容。 git checkout geek_chapter02更改分支到geek_chapter02。 ls -l看一下目录里边的内容。

【Rust日报】2023-12-14 Mojo 也要支持生存期

【帖子】学习 Rust 的经历&#xff0c;好坏参半 这篇 Reddit 帖子中&#xff0c;一位用户分享了他学习 Rust 编程语言的经历&#xff0c;并表示他的体验褒贬不一。他提到自己是一名有 15 年经验的开发者&#xff0c;曾使用过多种编程语言&#xff0c;包括 Go、Java、PHP、JavaS…

Sui第八轮资助:七个项目获得资助

今天&#xff0c;Sui基金会宣布本月的资助获得者&#xff0c;他们因构建项目以推动Sui的采用和发展而获得资助。要获得资助&#xff0c;项目必须提交提案&#xff0c;详细说明他们正在构建的内容、预算明细、关键里程碑、团队经验以及对Sui社区的预期贡献。 以下七个项目致力于…

MySQL事务与MVCC详解

前置概念之事务 在开始MVCC的讨论之前&#xff0c;我们必须了解一些关于事务的概念。 什么是事务 现在我们开发的一个功能需要进行操作多张表&#xff0c;假如我们遇到以下几种情况: 某个逻辑报错数据库连接中断某台服务器突然宕机… 这时候我们数据库执行的操作可能才到一…

【算法题】N进制减法(js)

返回结果-1 const str "2 11 1"; const str1 "8 07 1"; const str2 "16 af ff"; function solution(str) {const [n, minuend, subtrahend] str.split(" ");if (n < 2 || n > 35) return -1;else if (isValid(minuend) &am…

如何用 Cargo 管理 Rust 工程系列 丙

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/viSsCaFR2x9hZOvo1PoRqA 添加依赖项 前面已经提到过在 cargo 配置文件 Cargo.toml 中如何手动添加工程依赖项&#xff0c;cargo 同样提供了 add …

stable-diffusion-webui(AI绘画)项目实现,即遇到的问题

实现步骤&#xff1a; 为了使环境中的库版本不会乱&#xff0c;导致自己电脑原来一些项目无法运行最好使用虚拟环境 下载miniconda 在搜索中搜所miniconda找到 建立虚拟环境 conda create --name sdwebui python3.10.6 每次运行激活这个虚拟环境 conda activate sdwebui …