【动态规划】子序列问题I|最长递增子序列|摆动序列|最长递增子序列的个数|最长数对链

一、最长递增子序列

300. 最长递增子序列

算法原理:

💡细节:

 1.注意子序列子数组的区别:

(1)子序列:要求顺序是固定的(要求没那么高,所以子序列就多一些)

(2)子数组:要求是连着的(这个要求就必须高,所以子数组较少)

2.dp确定了以后,就不断向前推,i-1位置到i位置的最长子序列的长度,i-2到i...直到0-i位置,那么就引入一个j来记录[0,i-1]位置,j就表示上一个递增的位置,这样将dp[i]和dp[j]联系起来,注意有个前提是递增的,即nums[j]>nums[i]

3.又因为dp表示的是最长递增序列,所以需要取前面所有dp[j]位置的最大值

class Solution {public int lengthOfLIS(int[] nums) {int n = nums.length;int[] dp = new int[n];//初始化:为最小值for(int i=0;i<n;i++) dp[i] = 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]=Math.max(dp[j]+1,dp[i]);//j位置为结尾的最长长度}}ret = Math.max(ret,dp[i]);}return ret;}
}

二、摆动序列

376. 摆动序列

 算法原理:

💡细节:

1.因为需要知道上一个位置是上升还是下降,所以需要两个dp表

2.根据dp表的涵义,每次求f和g的时候需要求最大值j位置结尾的最长长度

class Solution {public int wiggleMaxLength(int[] nums) {int n = nums.length;int[] f = new int[n];//上升int[] g = new int[n];//下降//初始化为最小值for(int i=0;i<n;i++) f[i]=g[i]=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]=Math.max(g[j]+1,f[i]);else if(nums[j]>nums[i]) g[i]=Math.max(f[j]+1,g[i]);}ret = Math.max(ret,Math.max(f[i],g[i]));}return ret;}
}

三、最长递增子序列的个数

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

算法原理:

💡细节: 

1.前置知识:如果通过一次遍历在数组中找出最大值出现的次数

2.dp表如果只设置一个最长序列的个数,但是不知道每个位置的最大长度,是做不了的,所以还需要设置一个dp表

3.在求最长递增子序列的基础上,需要判断上一个位置(j位置结尾)的最大长度和i位置结尾的最大长度的关系

(1)len[j]+1==len[i]:count[i]+=count[j](最大长度+1,所以个数还是和上个位置一样)

(2)len[j]+1<len[i]:

(3)len[j]+1>len[i]:更新最大长度,并初始化count[i]为count[j]

4.返回值:跟上面前置知识一样求retcount(找retcount也就是在len[i]数组中找出最大值出现的次数)

class Solution {public int findNumberOfLIS(int[] nums) {int n = nums.length;int[] len = new int[n];int[] count = new int[n];for(int i=0;i<n;i++) len[i]=count[i]=1;int retlen = 1,retcount=1;for(int i=1;i<n;i++) {for(int j=0;j<i;j++) {if(nums[j]<nums[i]) {if(len[j]+1==len[i]) //计数count[i]+=count[j];else if(len[j]+1>len[i]) {//重新计数len[i]=len[j]+1;count[i]=count[j];}}}if(retlen==len[i]) retcount+=count[i];else if(retlen<len[i]) {retlen = len[i];retcount = count[i];}}return retcount;}
}

四、最长数对链

646. 最长数对链

 算法原理:

 💡细节: 

1.预处理:按照第一个元素排序(因为当计算dp[i]的时候,会发现倒数第二个位置可能是在i的左边,也可能在i的右边,所以要先进行排序)

2.其他部分跟 最长递增子序列 这题一样,只需将比较的值改为pairs[j][1]和pairs[i][0]即可

class Solution {public int findLongestChain(int[][] pairs) {//预处理Arrays.sort(pairs,(a,b)->a[0]-b[0]);int n = pairs.length;int[] dp = new int[n];for(int i=0;i<n;i++) dp[i] = 1;int ret = 1;for(int i=0;i<n;i++) {for(int j=0;j<i;j++) {if(pairs[j][1]<pairs[i][0]) {dp[i] = Math.max(dp[j]+1,dp[i]);}}ret = Math.max(ret,dp[i]);}return ret;}
}

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

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

相关文章

MyCat实现分库分表

两个集群 两个库 两个表 搭建数据库服务使用docker启动两个mysql 3506 3507连接MyCat创建两个数据源连接MyCat创建集群 mycat创建逻辑库MyCat创建全局表广播表创建分片表mycat逻辑库MyCat插入数据mycat查看数据物理库3506查看数据物理库3507查看数据 ER表创建ER表mycat插入数据…

Codigger:Vim的革新者,提升开发体验和功能性

深知Vim在编程和文本编辑领域的卓越地位&#xff0c;因此&#xff0c;在设计和开发过程中&#xff0c;Codigger始终将保留Vim的核心功能和高度定制能力作为首要任务。然而&#xff0c;Vim的复杂性和高度定制性也让很多新用户望而却步。为了降低这种使用门槛&#xff0c;Codigge…

什么是XXE漏洞,日常如何做好web安全,避免漏洞威胁

随着网络技术的不断发展&#xff0c;网站安全问题日益受到人们的关注。当前随着技术发展&#xff0c;网站存在一些常见的可能被攻击者利用的漏洞&#xff0c;而在众多网站安全漏洞中&#xff0c;XXE&#xff08;XML External Entity&#xff09;漏洞是一个不容忽视的问题。今天…

Git的安装和配置

一、Git的介绍 代码的一套托管工具&#xff0c;它分为两个仓库&#xff0c;首先将你写的代码提交到本地仓库&#xff0c;这个时候只有你可以看&#xff0c;和你一起开发的同事看不到。将本地仓库的代码推到远程仓库&#xff08;githab、gitee、gitlab等之一&#xff09;&#…

使用Flask-Admin创建强大的后台管理系统

文章目录 安装Flask-Admin创建Flask应用添加Flask-Admin添加模型扩展延伸自定义视图权限管理文件上传 结语 在Web应用开发中&#xff0c;后台管理系统是至关重要的组成部分&#xff0c;它能够让管理员轻松管理应用的各种数据和配置。Flask-Admin是一个功能强大的Flask扩展&…

vue的css深度选择器 deep /deep/

作用及概念 当 <style> 标签有 scoped 属性时&#xff0c;它的 CSS 只作用于当前组件中的元素&#xff0c;父组件的样式将不会渗透到子组件。在vue中是这样描述的&#xff1a; 处于 scoped 样式中的选择器如果想要做更“深度”的选择&#xff0c;也即&#xff1a;影响到子…

Verilog复习(四)| 组合逻辑

一位全加器结构描述&#xff1a; 数据流描述&#xff1a; 行为描述&#xff1a; 只要有事件发生&#xff08;列表中任何 信号有变化&#xff09;&#xff0c;就执行begin…end 的语句 。 always的事件控制方式 边沿触发 always (posedge clk) // clk从低电平->高&#x…

JeeSite 平台 Spring Boot 3 体验版发布,一个 Java 快速开发平台

引言 是时候为 Spring Boot 3 做准备了&#xff0c;2018年2月 Spring Boot 进入 2.0 时代&#xff0c;距今已经 5 年了。2022 年 11 月 Spring Boot 3.0 正式发布&#xff0c;它将基于 Spring Framework 6.0&#xff0c;并且需要 Java 17 版本&#xff0c;同时它也将是 Jakart…

AtCoder Beginner Contest 353 A~E(F,G更新中...)

A.Buildings 题意 给出若干个建筑&#xff0c;每个建筑有一个高度&#xff0c;问&#xff0c;从第二个建筑开始&#xff0c;比第一个建筑高的建筑中编号最小的是多少&#xff1f;如果不存在&#xff0c;输出-1. 分析 边输入边比较即可&#xff0c;如果循环结束还未找到&…

阿里开源编程大模型 CodeQwen1.5:64K92编程语言,Code和SQL编程,评测接近GPT-4-Turbo

前言 阿里巴巴最近发布的CodeQwen1.5模型标志着其在编程语言模型领域的一次重大突破。这款开源模型不仅支持高达92种编程语言和64K的上下文长度&#xff0c;而且在多项性能评测中显示出接近或超过当前行业领导者GPT-4-Turbo的能力。 Huggingface模型下载&#xff1a;https://h…

QTreeView学习 branch 虚线设置

1、方法一&#xff1a; #include <QStyleFactory> ui.treeView->setStyle(QStyleFactory::create("windows")); 2、方法二&#xff1a; QString strtyle2 R"( QTreeView::branch:has-siblings:!adjoins-item { border-image: url(:/TreeViewDe…

Vulnhub靶机随笔-Hacksudo_Aliens

Vulnhub靶机Hacksudo_Aliens详解 攻击机Kali IP:192.168.3.44 靶机 IP:未知 系统:未知 A.信息收集 扫描靶机存活性 确定IP地址 1.命令:arp-scan -l 扫描靶机开放端口及其服务版本信息 2.命令 nmap -A -p- -sV 靶机IP地址 靶机开放三个端口,22ssh端口,80web端…