【动态规划刷题 14】最长递增子序列 摆动序列

673. 最长递增子序列的个数

链接: 673. 最长递增子序列的个数
给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。

注意 这个数列必须是 严格 递增的。

示例 1:

输入: [1,3,5,4,7]
输出: 2
解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。
示例 2:

输入: [2,2,2,2,2]
输出: 5
解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。

1.状态表示*
我们解决这个问题需要两个状态,⼀个是「⻓度」,⼀个是「个数」:

len[i] 表⽰:以 i 为结尾的最⻓递增⼦序列的⻓度;
count[i] 表⽰:以 i 为结尾的最⻓递增⼦序列的个数

2.状态转移方程
对于len[i],很容易可以得出其状态转移方程,可以参考之前的题解。
对于count[i]:
在知道每⼀个位置结尾的最⻓递增⼦序列的⻓度时,count[i] :

  1. i. 我们此时已经知道 len[i] 的信息,还知道 [0, i - 1] 区间上的 count[j] 信 息,⽤ j 表⽰ [0, i - 1] 区间上的下标;
  2. ii. 我们可以再遍历⼀遍 [0, i - 1] 区间上的所有元素,只要能够构成上升序列,并且上 升序列的⻓度等于 dp[i],那么我们就把 count[i] 加上 count[j] 的值。这样循 环⼀遍之后, count[i] 存的就是我们想要的值。

3. 初始化
◦ 对于 len[i] ,所有元素⾃⼰就能构成⼀个上升序列,直接全部初始化为 1 ;
◦ 对于 count[i] ,全部初始化为 1 ;

4. 填表顺序
显⽽易⻅,填表顺序「从左往右」

5. 返回值
⽤ maxLen 表⽰最终的最⻓递增⼦序列的⻓度。
根据题⽬要求,我们应该返回所有⻓度等于 maxLen 的⼦序列的个数」。

代码:

 int findNumberOfLIS(vector<int>& nums) {int n=nums.size();vector<int> dp(n,1),count(n,1);int Count=1;int Max=1;for(int i=1;i<n;i++){for(int j=0;j<i;j++){if(nums[i]>nums[j]){  if(dp[j]+1==dp[i]){count[i]+=count[j];}if(dp[j]+1>dp[i]){dp[i]=dp[j]+1;count[i]=count[j];}}}if(Max==dp[i]) Count+=count[i];if(Max<dp[i]) {Max=dp[i];Count=count[i];} }return Count;}

在这里插入图片描述

646. 最长数对链

链接: 646. 最长数对链

给你一个由 n 个数对组成的数对数组 pairs ,其中 pairs[i] = [lefti, righti] 且 lefti < righti 。

现在,我们定义一种 跟随 关系,当且仅当 b < c 时,数对 p2 = [c, d] 才可以跟在 p1 = [a, b] 后面。我们用这种形式来构造 数对链 。

找出并返回能够形成的 最长数对链的长度 。

你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。

示例 1:

输入:pairs = [[1,2], [2,3], [3,4]]
输出:2
解释:最长的数对链是 [1,2] -> [3,4] 。
示例 2:

输入:pairs = [[1,2],[7,8],[4,5]]
输出:3
解释:最长的数对链是 [1,2] -> [4,5] -> [7,8] 。

解法思路

在⽤动态规划结局问题之前,应该先把数组排个序。因为我们在计算 dp[i] 的时候,要知道所有左区间⽐ pairs[i] 的左区间⼩的链对。排完序之后,只⽤
「往前遍历⼀遍」即可。

1.状态表示*
dp[i] 表⽰以 i 位置的数对为结尾时,最⻓数对链的⻓度

2.状态转移方程
对于 dp[i] ,遍历所有 [0, i - 1] 区间内数对⽤ j 表⽰下标,找出所有满⾜ pairs[j]
[1] < pairs[i][0] 的 j 。找出⾥⾯最⼤的 dp[j] ,然后加上 1 ,就是以 i 位置为结
尾的最⻓数对链。

3. 初始化
◦刚开始的时候,全部初始化为 1

4. 填表顺序
显⽽易⻅,填表顺序「从左往右」

5. 返回值
返回整个 dp 表中的最⼤值

代码:

int findLongestChain(vector<vector<int>>& pairs) {int n=pairs.size();sort(pairs.begin(),pairs.end());vector<int> dp(n,1);int len=1;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[i],dp[j]+1);}}len=max(len,dp[i]);}return len;}

在这里插入图片描述

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

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

相关文章

jd(商品详情)API接口

为了进行电商平台 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个jd应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载jdAPI的SDK并掌握基本的API基础知识和调用 4&#xff09;利用SDK接口和…

GIS前端-地图事件编程

GIS前端-地图事件编程 图层操作事件地图状态事件交互事件弹出框事件导出PDF 在地图上的一切操作均要采用地图事件机制来实现&#xff0c;即通过鼠标、键盘等交互&#xff0c;触发地图相关事件&#xff0c;进而调用相关功能接口函数实现相应的GIS功能。在具体的实现过程中&#…

openpnp - 设备电源抗干扰部件的选择

文章目录 openpnp - 设备电源抗干扰部件的选择概述END openpnp - 设备电源抗干扰部件的选择 概述 设备电源部分的干扰主要来自伺服和真空泵. 伺服是设备开机期间, 一直供电, 采用滤波器比较好. 型号为 CW4L2-10A-S(004)或者CW4-10A-S(004) CW4L2-10A-S(004)是二级滤波. CW4-1…

07 目标检测-YOLO的基本原理详解

一、YOLO的背景及分类模型 1、YOLO的背景 上图中是手机中的一个app&#xff0c;在任何场景下(工业场景&#xff0c;生活场景等等)都可以试试这个app和这个算法&#xff0c;这个app中间还有一个button&#xff0c;来调节app使用的模型的大小&#xff0c;更大的模型实时性差但精…

从零基础到精通Flutter开发:一步步打造跨平台应用

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 导言 Flutter是一种流行…

【HTML专栏2】VSCode的使用(新建HTML文件)

本文属于HTML/CSS专栏文章&#xff0c;适合WEB前端开发入门学习&#xff0c;详细介绍HTML/CSS如果使用&#xff0c;如果对你有所帮助请一键三连支持&#xff0c;对博主系列文章感兴趣点击下方专栏了解详细。 博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;HTML/CS…

linux 多重启动grub2详解

https://www.gnu.org/software/grub/manual/grub/grub.pdf

合并单元格中自动填充数字序列的方法详解

我们如何在Excel中将序列号填充到不同大小的合并单元格列表中?我们首先想到的是拖动“自动填充”手柄来填充合并的单元格,但在这种情况下,我们将收到以下警告消息,并且无法填充合并的单元。 有没有一种方法可以在不必手动键入数字的情况下对合并的单元格进行编号? 例如,…

HTML基础标签 CSS选择器 JavaScript基础语法 WebAPI_ 页面设计 HTTP协议

第 1 题&#xff08;简答题&#xff09; 题目名称&#xff1a; 编写博客, 总结 HTML 中的常用标签用法 题目内容&#xff1a; 编写博客, 总结 HTML 中的常用标签用法 第 2 题&#xff08;简答题&#xff09; 题目名称&#xff1a; image 标签的 alt 和 title 属性有什么…

华为云云耀云服务器L实例评测|基于华为云云耀云服务器L实例搭建EMQX大规模分布式 MQTT 消息服务器场景体验

文章目录 前言一、&#x1f604;华为云云耀服务器二、&#x1f604;产品实例创建相关1、&#x1f9e8;开通华为云云耀服务器2、&#x1f9e8;创建华为云云耀服务器实例3、&#x1f9e8;终端登录4、&#x1f9e8;华为云云耀云服务器密码重置 三、&#x1f604;安装开源产品EMQX四…

设计模式汇总

设计模式本质上是某类特定问题的代码设计解决方案&#xff0c;实际上是一套某类问题的代码设计经验总结。&#xff08;前辈总结的解决某类问题的切实可行的套路&#xff09; 问题 1、为什么要使用设计模式&#xff1f; 答&#xff1a;1、 提高代码复用率&#xff0c;降低开发成…

计算机系统的基本概念

计算机系统的基本概念 本文主要以hello.c这个程序的整个生命周期来简单了解一下计算机系统结构的基本概念。 #include <stdio.h>int main() {printf("hello, world\n");return 0; }gcc hello.c -o hello ./hello hello, world此刻&#xff0c;hello.c源程序…