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

本次的题与动态规划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.hqwc.cn/news/543350.html

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

相关文章

c++中类的6个默认成员函数

构造函数 构造函数是一个特殊的成员函数&#xff0c;名字与类名相同,创建类类型对象时由编译器自动调用&#xff0c;保证每个数据成员 都有 一个合适的初始值&#xff0c;并且在对象的生命周期内只调用一次。 构造函数是特殊的成员函数&#xff0c;需要注意的是&#xff0c;构…

2024.04

每一点建议都会包含为什么这么做的理由&#xff0c;帮助用户理解每个步骤背后的重要性和效果。 b004071ozy_05_amzn 第三步&#xff1a;授权开通资源中心&#xff08;点开通后&#xff0c;需要等待几分钟时间&#xff09; 图片 本文由 mdnice 多平台发布

深入了解 大语言模型(LLM)微调方法

引言 众所周知&#xff0c;大语言模型(LLM)正在飞速发展&#xff0c;各行业都有了自己的大模型。其中&#xff0c;大模型微调技术在此过程中起到了非常关键的作用&#xff0c;它提升了模型的生成效率和适应性&#xff0c;使其能够在多样化的应用场景中发挥更大的价值。 那么&…

C++的类和对象(七):友元、内部类

目录 友元 友元函数 友元类 内部类 匿名对象 拷贝对象时的一些编译器优化 再次理解类和对象 友元 基本概念&#xff1a;友元提供了一种突破封装的方式&#xff0c;有时提供了便利&#xff0c;但是友元会增加耦合度&#xff0c;破坏了封装&#xff0c;所以友元不宜多用&…

记录工作中莫名其妙的bug

1、问题&#xff1a;办公室的电脑突然除了我之外&#xff0c;都不能访问我们的线上系统了 原因&#xff1a;因为是内网&#xff0c;同事有刚刚升级了Windows11&#xff0c;配置的DNS被清了&#xff0c;还有同事换了公司的新电脑&#xff0c;还没有配DNS 位于&#xff1a;C /Win…

C#,入门教程(27)——应用程序(Application)的基础知识

上一篇: C#,入门教程(26)——数据的基本概念与使用方法https://blog.csdn.net/beijinghorn/article/details/124952589 一、什么是应用程序 Application? 应用程序是编程的结果。一般把代码经过编译(等)过程,最终形成的可执行 或 可再用 的文件称为应用程序。可执行文…

vue3项目随笔1

1,Eslint Prettier 报错情况&#xff1a; 解决办法&#xff1a; &#xff08;1&#xff09;下载Prettier - code formatter &#xff08;2&#xff09;配置setting.json文件 文件 -> 首选项 -> 设置 -> 用户 -> Eslint "editor.defaultFormatter":…

北斗卫星在桥隧坡安全监测领域的应用及前景展望

北斗卫星在桥隧坡安全监测领域的应用及前景展望 北斗卫星系统是中国独立研发的卫星导航定位系统&#xff0c;具有全球覆盖、高精度定位和海量数据传输等优势。随着卫星导航技术的快速发展&#xff0c;北斗卫星在桥隧坡安全监测领域正发挥着重要的作用&#xff0c;并为相关领域…

c语言的字符串函数详解

文章目录 前言一、strlen求字符串长度的函数二、字符串拷贝函数strcpy三、链接或追加字符串函数strcat四、字符串比较函数strcmp五、长度受限制字符函数六、找字符串2在字符串1中第一次出现的位置函数strstr七、字符串切割函数strtok&#xff08;可以切割分隔符&#xff09;八、…

【python】爬取杭州市二手房销售数据做数据分析【附源码】

一、背景 在数据分析和市场调研中&#xff0c;获取房地产数据是至关重要的一环。本文介绍了如何利用 Python 中的 requests、lxml 库以及 pandas 库&#xff0c;结合 XPath 解析网页信息&#xff0c;实现对链家网二手房销售数据的爬取&#xff0c;并将数据导出为 Excel 文件的过…

day-21 前 K 个高频元素

思路&#xff1a;用ans[]存储频次最高的k个元素&#xff0c;用anslen[]存储对应的索引&#xff0c;将nums进行排序依次统计每个元素出现次数&#xff0c;再判断是否需要对ans[]和anslen[]进行替换&#xff0c;最后ans即为答案 注意点&#xff1a;遍历结束后&#xff0c;还需要…

linux 使用docker安装 postgres 教程,踩坑实践

linux 使用docker安装 postgres 教程 踩坑实践,安装好了不能远程访问。 防火墙已关闭、postgres 配置了允许所有ip 访问、网络是通的。端口也是开放的&#xff0c;就是不能用数据库链接工具访问。 最后发现是云服务器端口没开 ,将其打开 到这一步完全正确了&#xff0c;但是…