[Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解

目录

  • 0.子序列 vs 子数组
  • 1.最长递增子序列
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.摆动序列
    • 1.题目链接
    • 2.题目链接
    • 3.代码实现


0.子序列 vs 子数组

  • 子序列
    • 相对顺序是跟源字符串/数组是一致的
    • 但是元素和元素之间,在源字符串/数组中可以是不连续的
    • 一般时间复杂度: O ( 2 n ) O(2^n) O(2n)
  • 子数组
    • 在源字符串/数组中挑出来,必须是连续的
      • 子串与子数组是一个意思
    • 一般时间复杂度: O ( N 2 ) O(N^2) O(N2)
  • 子序列其实相当于包含了子数组
  • 子序列问题经典解法:两层循环

1.最长递增子序列

1.题目链接

  • 最长递增子序列

2.算法原理详解

  • 注意:本题思考方式非常有标志性
  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i位置元素为结尾的所有子序列中,最长递增子序列的长度
    • 推导状态转移方程
      请添加图片描述

    • 初始化:vector<int> dp(n, 1)

    • 确定填表顺序:从左往右

    • 确定返回值:整个dp表里的最大值


3.代码实现

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[j] < nums[i])
            {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }

        ret = max(ret, dp[i]);
    }

    return ret;
}

2.摆动序列

1.题目链接

  • 摆动序列

2.题目链接

  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i位置元素为结尾的所有子序列中,最长的摆动序列的长度
      • 本题状态标识还可以继续划分
        • f[i]:以i位置元素为结尾的所有子序列中,最后一个位置呈现“上升”趋势的最长的摆动序列的长度
        • g[i]:以i位置元素为结尾的所有子序列中,最后一个位置呈现“下降”趋势的最长的摆动序列的长度
    • 推导状态转移方程

      • ji前面的任一一个数
        请添加图片描述
    • 初始化:vector<int> f(n, 1), g(n, 1)

    • 确定填表顺序:从左往右,两个表一起填

    • 确定返回值:两个dp表里的最大值


3.代码实现

int wiggleMaxLength(vector<int>& nums) 
{
    int n = nums.size();
    vector<int> f(n, 1), g(n, 1);

    int ret = 1;
    for(int i = 1; i < n; i++)
    {
        for(int j = 0; j < i; j++)
        {
            if(nums[j] < nums[i])
            {
                f[i] = max(f[i], g[j] + 1);
            }
            else if(nums[j] > nums[i])
            {
                g[i] = max(g[i], f[j] + 1);
            }
        }

        ret = max(ret, max(f[i], g[i]));
    }

    return ret;
}

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

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

相关文章

python绘制piper三线图

piper三线图 Piper三线图是一种常用于水化学分析的图表&#xff0c;它能够帮助我们理解和比较水样的化学成分。该图表由三个部分组成&#xff1a;两个三角形和一个菱形。两个三角形分别用于显示阳离子和阴离子的相对比例&#xff0c;而菱形部分则综合显示了这些离子比例在水样…

蓝屏,联想持续很久停留在正在准备windows请勿关闭计算机怎么办?解决方案如下。

联想小新&#xff0c;连续出现两次间隔一年半遇上上述问题&#xff0c;按电源键后也会出现下述情况&#xff0c;遇到问题不要着急&#xff0c;偶尔电脑也会生个小病什么的。 附上最后的解决办法&#xff1a;两次都成功┗|&#xff40;O′|┛ 嗷~~ 按上述步骤执行后重启计算机等…

Buffer Pool运行机制理解

Buffer Pool机制理解 一、为什么使用Buffer Pool&#xff1f; 众所周知&#xff0c;磁盘数据是以数据页的形式来去读取的&#xff0c;一个数据页默认大小 16K&#xff0c;也就是说你本意只想读取一行数据&#xff0c;但是它会给你加载一页的数据到buffer pool里面。这样的话就…

高等教育的AI革新:OpenAI面向大学推出ChatGPT Edu

OpenAI推出了ChatGPT Edu&#xff0c;这是一个为大学设计的专用版本&#xff0c;旨在让学生、教职员工、研究人员和校园运营能够负责任地使用AI。 ChatGPT Edu 将AI技术引入了教育领域&#xff0c;其建立在GPT-4o的基础上&#xff0c;它不仅能够处理文本和图像&#xff0c;还…

xss漏洞学习(题解)

1.简单知识点回顾 XSS允许恶意web用户将代码植入到提供给其它用户使用的页面中。 特点&#xff1a;能注入恶意的HTML/JavaScript代码到用户浏览器网址上&#xff0c;从而劫持会话 类型&#xff1a; DOM型&#xff1a;属于反射型的一种&#xff0c;利用非法输入来闭合对应的h…

【源码+文档+调试讲解】火车票订票系统设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装火车票订票系统软件来发挥其高效地信息处理的作用&#xff…

车灯罩外壳破裂破损掉角等修复,修复后合面合壳密封用泰达克车灯无痕修复UV胶车灯合面密封UV胶。

一&#xff1a;专用车灯无痕修复UV胶 车灯无痕修复专用胶主要成份是改性丙烯酸UV树脂&#xff0c;主要应用在车灯的专业无痕修复领域。 具有如下特点&#xff1a; 固化时间快&#xff0c;通过紫外光照射5-15秒固化。 高度透明&#xff0c;固化后透光率高&#xff0c;折射率接…

佳能R6M2断电覆盖的恢复方法

佳能R6是佳能R系列中的一款高端机&#xff0c;最近两年佳能和索尼不断斗法&#xff0c;都号称自己的新机型能达到影视级&#xff0c;不过目前看貌似索尼更胜一筹。下边这个案例是文件拍摄时断电&#xff0c;结果变成0字节&#xff0c;然后覆盖了部分数据。 故障存储:128G存储卡…

新加坡裸机云站群服务器稳定性怎么样

新加坡裸机云站群服务器的稳定性在云计算领域备受关注&#xff0c;这得益于其卓越的硬件配置、先进的数据中心设计、优质的网络连接以及严格的管理措施。以下是对新加坡裸机云站群服务器稳定性的详细科普&#xff1a; 一、硬件与配置 新加坡裸机云站群服务器通常采用高性能的物…

12V升20V3.5A升压恒压WT3207

12V升20V3.5A升压恒压WT3207 WT3207是一款高效PWM升压控制器&#xff0c;采用SO-8封装设计&#xff0c;专为低输入电压应用优化。该控制器支持5V至36V的宽输入电压范围&#xff0c;使其能够有效提升12V、15V和19V系统的电压水平&#xff0c;特别适合于两节或三节锂离子电池供电…

SpringBoot:基于SpringBoot实现多数据源动态切换

一、前言 Spring Boot 多数据源&#xff0c;也称为动态数据源&#xff0c;是指在Spring Boot项目中配置多个数据源&#xff0c;以支持不同的数据库访问需求。这种配置方式在项目开发逐渐扩大、单个数据源无法满足项目支撑需求时变得尤为重要。 二、目的 配置多数据源的主要目…

FinRobot:一个由大型语言模型(LLM)支持的新型开源AI Agent平台,支持多个金融专业AI Agent

财务分析一直是解读市场趋势、预测经济结果和提供投资策略的关键。这一领域传统上依赖数据&#xff0c;但随着时间的推移&#xff0c;越来越多地使用人工智能&#xff08;AI&#xff09;和算法方法来处理日益增长的复杂数据。AI在金融领域的作用显著增强&#xff0c;它自动化了…

vm:为虚拟机配置多个虚拟网卡(ubuntu20.04)

前言&#xff1a; 环境&#xff1a;虚拟机 ubuntu 20.04 要求&#xff1a;如标题&#xff0c;但是这里针对的是 ubuntu 20.04&#xff0c;对于其他操作系统&#xff0c;可以找一下其他操作系统对应的配置文件是什么 vm 添加虚拟网卡 首先进入 vm&#xff1a; 点击设置&#xf…

【AI大模型】如何让大模型变得更聪明?基于时代背景的思考

【AI大模型】如何让大模型变得更聪明 前言 在以前&#xff0c;AI和大模型实际上界限较为清晰。但是随着人工智能技术的不断发展&#xff0c;基于大规模预训练模型的应用在基于AI人工智能的技术支持和帮助上&#xff0c;多个领域展现出了前所未有的能力。无论是自然语言处理、…

EPSON爱普生RTC RA8900CE/RA8000CE+松下Panasonic电池组合

RTC是一种实时时钟&#xff0c;用于记录和跟踪时间&#xff0c;具有独立供电和时钟功能。在某些应用场景中&#xff0c;为了保证RTC在断电或者其他异常情况下依然能够正常工作&#xff0c;需要备份电池方案来提供稳定的供电。本文将介绍EPSON爱普生RTC RA8900CE/RA8000CE松下Pa…

laravel项目配置Facades Redis自动补全,方法查看

问题原因: 因为Laravel的Redis连接实例是通过RedisManger的工厂类创建的,返回的是一个mixin的类型,因此在IDE中不能自动补全Redis的方法,缺少这个功能,使用起来有些麻烦,尤其是Redis有数十个方法,每个方法也有不少参数。 相关部分的代码如下: /*** @mixin \Illumina…

super().__init__() 来自于哪个PEP

super() 的简化用法&#xff08;即不带参数的 super()&#xff09;是在 Python 3 中引入的。这个改进是由 PEP 3135 规范化的。 PEP 3135: New Super PEP 3135 标题为 “New Super”。它介绍了一种新的方式来调用超类的方法&#xff0c;即不再需要显式地传递当前类和实例&…

格雷希尔GripSeal:G60P系列快速连接器,解决外螺纹无损伤连接的密封方案

在家电、卫浴行业的生产中&#xff0c;外螺纹连接往往面临着严苛的工作环境和复杂的使用场景;比如洗衣机、热水器、乃至龙头阀的一些塑料螺纹、铝合金螺纹和铜管螺纹&#xff0c;它们都需要一种既安全又无损的连接方式。 传统的连接方式会对这些螺纹造成刮伤&#xff0c;影响了…

【MyBatis】MyBatis操作数据库(一)

目录 MyBatis的基础定义MyBatis配置相关文件一、注解操作数据库1.1 Insert(插入注解)1.2 Delete(删除注解)1.3 Update(修改注解)1.4 Select(重点&#xff1a;查询注解)注解解决查询不匹配问题拓展&#xff1a;Param(重命名注解)和OPtions(自增注解) 二、 XML操作数据库2.1 xml实…

HTML语义化标签

<header> 主要用于网页整体顶部&#xff0c;<article>头部&#xff0c;<section>头部 <nav> 导航&#xff0c;一般有主要导航&#xff0c;路径导航&#xff0c;章节导航&#xff0c;内容目录导航 <main> 网页主要区域&#xff0c;一般一个网页…