动态规划8, 摆动序列,最长递增子序列,最长数对链

news2024/12/22 17:21:31

本次的题与动态规划7 的题有相似与共通之处,建议先去看 动态规划7:动态规划7

摆动序列

在这里插入图片描述

什么是摆动序列? 就像这种:
一个数,一个下降,上升,来回上升下降都可以叫摆动序列。
在这里插入图片描述
思路:

  1. 经验+题目要求

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

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

  1. 状态转移方程
    对于 f[i] 来讲,当长度为1,意味着只有这一个数的时候,长度为1,因为他本身就可以构成摆动序列
    当长度大于1,并且以nums[i] > nums[j] 的前提下,(j的范围为0 ~ i-1 , 因为子序列是可以删除一些原始数组元素的)
    f[i] 就等于 max(g[i] + 1, f[i]), 为什么有max操作,因为每次都要最长摆动序列的长度。

    在这里插入图片描述

  2. 初始化
    f表和g表全部都初始化为1,这样的好处是不用考虑两者长度为1的情况了。

  3. 填表顺序
    从左向右填写,两个表一起填。

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int n = nums.size();
        vector<int> up(n,1);
        auto down = up;
        int ret = 1;
        for(int i = 1; i<n; i++)
        {
            for(int j = 0; j<i; j++)
            {
                if(nums[i] > nums[j])
                    up[i] = max(down[j]+1,up[i]);
                else if(nums[i] < nums[j])
                    down[i] = max(up[j]+1,down[i]);

                ret = max(ret,max(up[i],down[i]));
            }
        }
        return ret;
    }
};

最长递增子序列的个数

在这里插入图片描述

小 demo:一次遍历找到数组中最大值出现的次数
在这里插入图片描述
思路:

  1. 经验+题目要求

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

对于本题,如果只定一个状态数组是不够的,因为我们既要知道最长递归子序列长度,还要知道最长长度有几个。所以,我们需要定义两个状态数组,分别表示以 i 结尾的最长递增子序列的长度和个数。
len[i]表示:以i 位置为结尾的所有子数组中,最长递增子序列的长度。
count[i]表示:以i 位置为结尾的所有子数组中,最长递增子序列的个数。

  1. 状态转移方程

对于len的分析,和上一道题一样,只不过是上一道题的增区间。
在这里插入图片描述
对于count的分析,我们要和len放到一起:
对于单独的一个数,len和count都为1,
如果满足nums[i] > nums[j] ,并且 当len[j] +1 等于 len[i]的情况,就是j位置的最大长度 加上一个新的 i 位置 正好是leni ,这时候count[i] 不能+1,假如前面有5个最长长度的,新加上 i 位置的,那不还是5个最长长度,所以为
count[i] += count[j].
如果为len[j] + 1 < len[i] 无视
如果为len[j] + 1 > len[i] ,更新最大值,让len[i] = len[j]+1 , count[i] = count[j];

在这里插入图片描述

  1. 初始化
    两个表都初始化为1;

  2. 填表顺序
    从左往右,两个表一起填写

class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        int n = nums.size();
        vector<int> len(n,1);
        auto count = len;
        int relen = 1;
        int recount = 1;
        for(int i = 1; i<n; i++)
        {
            for(int j = 0; j<i; j++)
            {
                if(nums[i] > nums[j])
                {
                    if(len[j]+1 == len[i])
                        count[i]+=count[j];
                    if(len[j] + 1 > len[i])
                    {
                        len[i] = len[j]+1;
                        count[i] = count[j];
                    }
                }
            }

            if(relen == len[i]) recount+=count[i];
            else if(relen < len[i]) relen = len[i], recount = count[i];
        }
        return recount;
    }
};

最长数对链

在这里插入图片描述
当我们在分析的过程中,我们会发现当后面的数对不按顺序的时候,可以填后面的值有很多,比如示例二:后面的【7,8】和【4,5】没按顺序,两个都可以填到后面,所以我们要进行预处理:按照第一个元素排序即可。

思路:

  1. 经验+题目要求

dp[i]表示:以 i 位置为结尾的所有数对链中,最长的数对链个数。

  1. 状态转移方程
    跟之前的题分析过程基本一样,就是变成数对了。
    在这里插入图片描述

  2. 初始化
    全部初始化为1.

  3. 填表顺序
    从左往右

class Solution {
public:
    int findLongestChain(vector<vector<int>>& pairs) {
        sort(pairs.begin(),pairs.end());

        int n = pairs.size();
        vector<int> dp(n,1);
        int ret= 1; //可以防止pairs里面只有一对数对的情况
        for(int i = 1; i<n; i++)
        {
            for(int j = 0; j<i; j++)
            {
                if(pairs[i][0] > pairs[j][1])
                    dp[i] = max(dp[j]+1,dp[i]);
            }
            ret = max(ret,dp[i]);
        }
        return ret;
    }
};

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

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

相关文章

政安晨:【深度学习处理实践】(八)—— 表示单词组的两种方法:集合和序列

咱们接着这个系列的上一篇文章继续&#xff1a; 政安晨&#xff1a;【深度学习处理实践】&#xff08;七&#xff09;—— 文本数据预处理https://blog.csdn.net/snowdenkeke/article/details/136697057 机器学习模型如何表示单个单词&#xff0c;这是一个相对没有争议的问题…

分析基于解析物理模型的E模式p沟道GaN高电子迁移率晶体管(H-FETs)

来源&#xff1a;Analyzing E-Mode p-Channel GaN H-FETs Using an Analytic Physics-Based Compact Mode&#xff08;TED 24年&#xff09; 摘要 随着近期对用于GaN互补技术集成电路&#xff08;ICs&#xff09;开发的p沟道GaN器件研究兴趣的激增&#xff0c;一套全面的模型…

算法笔记 连载中。。。

HashMap&#xff08;会根据key值自动排序&#xff09; HashMap<String, Integer> hash new HashMap<>() hash.put(15,18) hash.getOrDefault(ts, -1) //如果ts(key)存在&#xff0c;返回对应的value 否则返回-1 hashMap1.get(words1[i])1会报错&#xff0c;因…

快速高效地数据分析处理:QtiPlot for Mac中文直装版 兼容M

QtiPlot 是一个用于数据分析和可视化的跨平台科学应用程序。由于其多语言支持&#xff0c;QtiPlot 被积极用于世界各地学术机构的教学。许多研究科学家信任 QtiPlot 来分析他们的数据并发布他们的工作结果。来自各个科学领域和行业的数千名注册用户已经选择了 QtiPlot 来帮助他…

SQLiteC/C++接口详细介绍之sqlite3类(十五)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十四&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十六&#xff09; 47.sqlite3_set_authorizer 用法&#xff…

【Preprocessing数据预处理】之Scaler

在机器学习中&#xff0c;特征缩放是训练模型前数据预处理阶段的一个关键步骤。不同的缩放器被用来规范化或标准化特征。这里简要概述了您提到的几种缩放器&#xff1a; StandardScaler StandardScaler 通过去除均值并缩放至单位方差来标准化特征。这种缩放器假设特征分布是正…

Seata 2.x 系列【9】事务会话存储模式

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 存储模…

虚拟机网络链接

在虚拟网络设置中找到如下界面&#xff1a; "子网 IP" 192.168.79.0/24 表示一个局域网络&#xff0c;它有254个可能的IP地址可供分配&#xff08;192.168.79.1到192.168.79.254&#xff09;&#xff0c;255.255.255.0 是子网掩码&#xff0c;定义了网络和主机部分。…

MySQL--深入理解MVCC机制原理

什么是MVCC&#xff1f; MVCC全称 Multi-Version Concurrency Control&#xff0c;即多版本并发控制&#xff0c;维持一个数据的多个版本&#xff0c;主要是为了提升数据库的并发访问性能&#xff0c;用更高性能的方式去处理数据库读写冲突问题&#xff0c;实现无锁并发。 什…

Cartwheel——文本生成3D动作或动画的工具

一个强大的文本转3D动画平台,用户只需通过输入文字提示即可生成视频、游戏、电影、广告、社交或VR项目所需的3D动画角色。 Cartwheel 是一个功能强大的文本到动画平台。只需键入即可为您的视频、游戏、电影、广告、社交或 VR 项目制作角色动画 定位: 定位于为用户提供简单…

Unity类银河恶魔城学习记录10-11 p99 Aliment visual effects源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili EntityFX.cs using System.Collections; using System.Collections.Gener…

Mysql事务+锁测试 RR行锁升级

Mysql事务锁测试 Mysql5.7 在隔离级别RR下&#xff0c;添加写锁&#xff0c;锁住一行数据&#xff0c;写锁是排它锁&#xff0c;不允许其它的读写、 另外开启一个连接&#xff0c;进行写操作&#xff0c;发现执行没有成功&#xff0c;在等待锁 查询事务表&#xff0c;有两个事…

openssl3.2 - note - Decoders and Encoders with OpenSSL

文章目录 openssl3.2 - note - Decoders and Encoders with OpenSSL概述笔记编码器/解码器的调用链OSSL_STORE 编码器/解码器的名称和属性OSSL_FUNC_decoder_freectx_fnOSSL_FUNC_encoder_encode_fn官方文档END openssl3.2 - note - Decoders and Encoders with OpenSSL 概述 …

大数据Doris(六十八):基于Doris on ES的架构实现总结

文章目录 基于Doris on ES的架构实现总结 一、Mem Join架构遗留的核心问题 二、Doris

河南大学大数据平台技术实验报告二

大数据平台技术课程实验报告 实验二&#xff1a;HDFS操作实践 姓名&#xff1a;杨馥瑞 学号&#xff1a;2212080042 专业&#xff1a;数据科学与大数据技术 年级&#xff1a;2022级 主讲教师&#xff1a;林英豪 实验时间&#xff1a;2024年3月15日3点 至 2024年3月15日4点40 …

力扣经典题:分割平衡字符串

大佬的代码非常简洁 int balancedStringSplit(char * s){short i0,count0,sign0;while(s[i]){signs[i]L?sign1:sign-1;if(sign0) count;}return count; }

安装gpu-torch(已经成功)

### &#xff01;&#xff01;&#xff01;直接使用pip安装&#xff0c;不要使用conda安装&#xff0c;使用conda安装总是会安装成CPU版本。 1.第一次尝试 之前按照官网安装pytorch的命令进行安装&#xff0c;结果安装出来是cpu版本的&#xff0c;试过https://blog.csdn.net/…

【日常记录】【CSS】css下划线动画

文章目录 1、效果2、思路3、代码 1、效果 2、思路 整体可以用 背景来做线&#xff1a;可以用 渐变 配合 background-size 、 background-position 、background-repeat正向动画&#xff1a;可以不断追加 background-size x 轴的大小来控制&#xff0c;当鼠标移入的时候&#x…

【应急响应靶场web2】

文章目录 前言 一、应急响应 1、背景 2、webshell查杀 3、日志排查 1&#xff09;apache日志 2&#xff09;nginx日志 3&#xff09;ftp日志 4、隐藏账户 5、文件筛选 二、漏洞复现 总结 前言 靶场来源&#xff1a;知攻善防实验室 一、应急响应 1、背景 小李在某…

【算法训练营】周测1

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 如果需要答案代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 考题11-1 题目描述 有一个初始时为空的序列&#xff0c;你的任务是维护这个…