动态规划7,等差数列划分,湍流子数组,唯一的子字符串,最长递增子序列

等差数列划分

在这里插入图片描述
思路:

  1. 经验+题目要求

dp[i]表示:以 i 位置为结尾的所有子数组中有多少个等差数列

  1. 状态转移方程

对 dp[i] 位置,数列至少有三个元素,如果相邻三个为等差数列,dp[i] = dp[i-1] + 1;
如果相邻三个不为等差数列,dp[i] = 0;
在这里插入图片描述

  1. 初始化

dp[0] 和 dp[1] 位置都不符合判断要求,直接 dp[0] = dp[1] = 0;

  1. 填表顺序
    从左往右,返回表里所有的和。
class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();vector<int> dp(n);int count = 0;for(int i = 2; i<n; i++){if(nums[i]-nums[i-1] == nums[i-1]-nums[i-2])dp[i] = dp[i-1]+1;elsedp[i] = 0;count+=dp[i];}return count;}
};

最长湍流子数组

在这里插入图片描述

什么叫湍流子数组?

像这样一升一降的就叫湍流子数组。
在这里插入图片描述
思路:

1.经验+题目要求

dp[i]表示:以 i 位置为结尾的所有子数组中,最长湍流子数组的长度。

对于本题,如果只定一个状态数组是不够的,因为我们只有区分了 i 位置是在增长还是在降低,才能判断 i + 1 位置是否能续上前面的波浪。所以,我们需要定义两个状态数组,分别表示以 i 结尾的在增长和降低的最长湍流子数组长度。
f[i] 表示:以i 位置为结尾的所有子数组中,最后呈现 “ 上升” 状态下的最长湍流数组的长度。
g[i] 表示:以i 位置为结尾的所有子数组中,最后呈现 “ 下降” 状态下的最长湍流数组的长度。

2.状态转移方程

在这里插入图片描述
在这里插入图片描述

  1. 初始化

单个 存在为1,直接初始化全为1。

  1. 填表

从左往右,两个表一起填写。

class Solution {
public:int maxTurbulenceSize(vector<int>& arr) {int n = arr.size();vector<int> f(n,1);auto g = f;int ret = 1;//最差情况是1,ret写为1;for(int i = 1; i<n; i++){if(arr[i] > arr[i-1]){f[i] = g[i-1] + 1;ret = max(ret,f[i]);}else if(arr[i] < arr[i-1]){g[i] = f[i-1] + 1;ret = max(ret,g[i]);}}return ret;}
};

环绕字符串中唯一的子字符串

在这里插入图片描述

思路:

  1. 经验+题目要求

dp[i]表示:以 i 位置为结尾的所有字串中,有多少个在 base 中出现过。

  1. 状态转移方程

如果长度为1,就是本身字符串为1;
长度大于1:就要看s[i-1] + 1是否等于s[i] ;(特殊情况是“za”的情况)
在这里插入图片描述

  1. 初始化

dp 表里面所有的值都初始化为1。因为每一个本身字符都在base中出现过。

  1. 填表

从左往右填表

去重操作:

对于右边的例子,abc 在 yzabc,zabc都出现过,我们直接取以c结尾的最大的dp值就可以。
在这里插入图片描述

class Solution {
public:int findSubstringInWraproundString(string s) {int n = s.size();vector<int> dp(n,1);for(int i = 1; i<n; i++){if(s[i-1] + 1 == s[i] || (s[i-1] == 'z' && s[i] == 'a'))dp[i] = dp[i-1] + 1;}int hash[26] = {0};for(int i = 0; i<n; i++){hash[s[i] - 'a'] = max(hash[s[i]-'a'],dp[i]);}int sum = 0;for(auto x : hash) sum+=x;return sum;}
};

最长递增子序列

在这里插入图片描述
注意:这里的子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

思路:

  1. 经验+题目要求

dp[i]表示:以 i 位置为结尾的所有子序列中,最长递增子序列的长度。

  1. 状态转移方程

如果长度为1,就为1;
长度大于1,就要找nums[i] 大于 nums(0,j)里面的子序列,大于的话就为dp[i] = dp[j] + 1;
然后每一次找到dp[i] 里面的最大值并记录。

在这里插入图片描述

  1. 初始化

全部初始化为1,因为长度为1,dp[i] 为1.

  1. 填表

从左往右填表:

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();vector<int> dp(n,1);int ret = 1;for(int i = 1; i<n; i++){for(int j = 0; j<i; j++){if(nums[i] > nums[j]){dp[i] = max(dp[j] + 1,dp[i]);}ret = max(ret,dp[i]);}}return ret;}
};

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

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

相关文章

windows批处理脚本(cmd指令)

一、简介 最早期的电脑系统是DOS系统&#xff0c;DOS系统只有一个黑漆漆的窗口&#xff0c;需要自己输入命令&#xff0c;所以学习命令是很有必要的&#xff0c;那么CMD命令大全是什么?直到今天的Windows系统&#xff0c;还是离不开DOS命令的操作。如今懂得使用windows批处理脚…

【AI绘画教程】AI绘画图生图怎么用?

AI绘画技术已经越来越成熟&#xff0c;越来越多的人开始尝试利用AI进行创作。而AI绘画图生图作为一款优秀的AI绘画工具&#xff0c;正是帮助许多人创作的好帮手。 AI绘画图生图功能可以通过多种软件实现&#xff0c;具体的操作步骤可能因软件而异&#xff0c;但大体流程相似。以…

基于springboot+vue的会议室预约系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 随着互联网技术的发展&#xff0c;各行各业乃至人们的衣食住行都离不开网络。就拿最普普通通的衣食住行来说吧&#xff0c;穿衣服、买衣服我们现在基本都是在网络上进行购买&#xff0c;线下商场基本不去。…

1688商品详情数据采集(商品属性,规格,价格,详情图等)

京东商品详情数据采集是一个复杂但重要的过程&#xff0c;它涉及获取商品的详细信息&#xff0c;包括商品属性、规格、价格以及详情图等。以下是关于如何进行京东商品详情数据采集的基本步骤&#xff1a; 确定采集目标&#xff1a;首先&#xff0c;你需要明确需要采集的商品信…

ARM 汇编指令:(五)CMP指令

目录 1.CMP比较指令 2.指令条件码 cond 1.CMP比较指令 CMP指令是计算机指令集中的一种比较指令&#xff0c;用于比较两个操作数的大小关系或相等性&#xff0c;并根据比较结果设置或更新条件码寄存器&#xff08;或程序状态字&#xff09;的标志位。 指令格式&#xff1a;C…

VUE内盘期货配资软件源码国际外盘二合一

开发一个Vue内盘期货配资软件源码&#xff0c;同时兼容国际外盘二合一的功能&#xff0c;是一个复杂且专业的任务&#xff0c;涉及前端Vue.js框架的使用、后端服务器处理、数据库管理、实时交易接口对接等多个方面。下面是一些关于开发此类软件的基本指导和考虑因素&#xff1a…

什么是同城上门预约按摩系统,上门预约平台有哪些功能?

随着互联网技术的发展&#xff0c;人们的生活方式发生了很大的变化。在日常生活中&#xff0c;大家都习惯使用手机来订餐、购物、家政服务等&#xff0c;这也为我们的生活带来了很大的便利。而同城按摩小程序作为一种新兴的按摩预约方式&#xff0c;受到了越来越多人的欢迎。下…

机器视觉检测设备的组成要素

机器视觉检测设备是一种先进的自动化检测技术工具&#xff0c;它利用光学、图像处理和计算机硬件及软件技术模拟并扩展人类的视觉功能&#xff0c;以实现对产品或目标物体进行自动化的尺寸测量、缺陷检测、表面质量评估、颜色识别、形状匹配以及位置判断等功能。这种设备通常包…

c/c++| 常规 |sizeof 、strlen

总结来说 &#xff0c;sizeof 查看内存给对象分配的空间大小&#xff0c;不仅仅是普通的内置变量&#xff0c;还包括用户自定义变量、结构体、类对象 然后strlen 是查看字符串的实际长度大小&#xff0c;注意它不会计算那个结束符’\0’

重生奇迹MU攻击防御技能石哪里掉

在《重生奇迹MU》中&#xff0c;攻击和防御技能石可以从以下途径获得&#xff1a; 1.怪物掉落&#xff1a;你可以通过击败怪物获得攻击和防御技能石&#xff0c;不同的怪物掉落不同的石头。你可以在各个地图的怪物掉落表中查看特定怪物掉落的技能石。 2.商店购买&#xff1a;…

【教程】APP加固的那些小事

摘要 APP加固是保护APP代码逻辑的重要手段&#xff0c;通过隐藏、混淆、加密等操作提高软件的逆向成本&#xff0c;降低被破解的几率&#xff0c;保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法&#xff0c;以及处理安装出现问题的情况和资源文件加固策略选择…

怎么查看电脑是不是固态硬盘?简单几个步骤判断

随着科技的发展&#xff0c;固态硬盘&#xff08;Solid State Drive&#xff0c;简称SSD&#xff09;已成为现代电脑的标配。相较于传统的机械硬盘&#xff0c;固态硬盘在读写速度、稳定性和耐用性等方面都有显著优势。但是&#xff0c;对于不熟悉电脑硬件的用户来说&#xff0…

3D地图在BI大屏中的应用实践

前言 随着商业智能的不断发展&#xff0c;数据可视化已成为一项重要工具&#xff0c;有助于用户更好地理解数据和分析结果。其中&#xff0c;3D地图作为一种可视化工具&#xff0c;已经在BI大屏中得到了广泛地应用。 3D地图通过将地理信息与数据相结合&#xff0c;以更加直观…

【Linux】Shell编程【一】

shell是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务。 Shell属于内置的…

【C++ 学习】程序内存分布

文章目录 1. C 内存分布的引入 1. C 内存分布的引入 ① 栈又叫堆栈&#xff1a;非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。 ② 内存映射段&#xff1a;是高效的I/O映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存…

【知识库系统】使用SpringSecurity进行身份认证

一、理论知识部分 SpringSecurity 的官网文档地址&#xff1a;SpringSecurity 这里以24年3月份的 6.2.2 版本为例&#xff0c;记录一下学习过程。 1. SpringSecurity 是基于 Servlet Filters 的&#xff0c;而 Servlet Filters 中的流程如下&#xff1a;首先由客户端 Client…

时间复杂度中的log(n)底数是多少?

问题&#xff1a; 最近有好几学生问我&#xff0c;无论是计算机算法概论、还是数据结构书中&#xff0c; 关于算法的时间复杂度很多都用包含O(logN)这样的描述&#xff0c;但是却没有明确说logN的底数究竟是多少。 解答&#xff1a; 算法中log级别的时间复杂度都是由于使用了分…

关于stm32(CubeMX+HAL库)的掉电检测以及flash读写

1.掉电检测 CubeMX配置 只需使能PVD中断即可 但是使能了PVD中断后还需要自行配置一些PWR寄存器中的参数&#xff0c;我也通过HAL库进行编写 void PVD_config(void) {//配置PWRPWR_PVDTypeDef sConfigPVD; sConfigPVD.PVDLevel PWR_PVDLEVEL_7; …

Python学习笔记1:Pycharm首次安装环境搭建汉化

Pycharm首次安装环境搭建汉化笔记 1.下载网址 首先下载专业版的pycharm&#xff0c;这里建议下载专业版是因为功能更全面&#xff0c;社区版的往往没有远程调控等实践功能。 网址贴在下方&#xff1a; https://www.jetbrains.com/pycharm/download/?sectionwindows •Profe…

解决gpt无法发送对话的问题

问题描述 如图&#xff0c;今天登上去发现怎么无法发送消息 解决 可能是cookie问题&#xff0c;重新删除了就行了 cookie删除后&#xff0c;需要重新登录&#xff0c;主题色也重置为原来的白色了