【动态规划】子序列问题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.mzph.cn/pingmian/10944.shtml

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

相关文章

2024年深圳市教师招聘报名流程(建议电脑)

2024年深圳市教师招聘报名流程&#xff08;建议电脑&#xff09; #深圳教师招聘 #深圳教招 #深圳教师招聘考试 #教师招聘报名照片处理 #深圳教师招聘笔试

(Java)心得:LeetCode——19.删除链表的倒数第 N 个节点

一、原题 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&…

1-02-02:虚拟化与容器化Docker环境搭建

1.02.02 虚拟化与容器化Docker环境搭建 一. 虚拟化与容器化技术简介1. 虚拟机环境2. docker环境 二. Docker 架构与隔离机制2.1 Docker 架构2.2 Docker 隔离机制2.3 资源限制2.4 Docker应用场景 三. 实战:Docker在Centos7安装与镜像加速 ❤❤❤3.1 docker安装3.2 设置镜像加速 …

17 SPI FLASH读写

SPI 协议简介 SPI 即 Serial Periphera linterface 的缩写&#xff0c;顾名思义就是串行外围设备接口&#xff0c;主要用于与FLASH、实时时钟、AD 转换器等外设模块的通信&#xff0c;它是一种高速的全双工同步的通信总线。 SPI 设备分为主设备和从设备&#xff0c;SPI 通信必…

crossover24中文破解版百度云免费下载 crossover永久免激活汉化包安装使用教程 crossover24激活码分享

原则上&#xff0c;我们不提倡各位使用破解版&#xff0c;这是处于对知识产权的保护&#xff0c;也是为了各位的长远利益。使用正版你可以获得更优质的服务和完善的产品功能。 但仍然有部分用户由于预算、使用习惯等原因&#xff0c;需要破解版。所以本文不讲原则&#xff0c;…

有没有适合女生或者宝妈下班后可以做的副业?

宝妈与上班族女生的新篇章&#xff1a;水牛社副业兼职之旅 在繁忙的职场和温馨的家庭之间&#xff0c;不少女性渴望找到一种既能兼顾家庭又能实现自我价值的兼职方式。对于上班族女生和宝妈们来说&#xff0c;水牛社这样的线上任务平台为她们提供了一个全新的选择。 上班族女…

【备战软考(嵌入式系统设计师)】12 - 嵌入式系统总线接口

我们嵌入式系统的总线接口可以分为两类&#xff0c;一类是并行接口&#xff0c;另一类是串行接口。 并行通信就是用多个数据线&#xff0c;每条数据线表示一个位来进行传输数据&#xff0c;串行接口就是一根数据线可以来一位一位地传递数据。 从上图也可以看出&#xff0c;并行…

SR3-05S电机保护器 施耐德 EOCR-SR3

EOCR-SR3电机保护器 施耐德 EOCR主要产品有电子式电动机保护继电器&#xff0c;电子式过电流继电器&#xff0c;电子式欠电流继电器&#xff0c;电子式欠电压继电器&#xff0c;其它保护和监视装置&#xff0c;电流互感器。 系列型号&#xff1a; EOCR-SR3-05S EOCR-SR3-30…

VR全景技术在养老院的应用优势浅析

随着时代的快速发展&#xff0c;人口老龄化越来越严重&#xff0c;如何利用VR技术提升养老服务的质量&#xff0c;成为了社会各界关注的焦点。为养老院拍摄制作VR全景&#xff0c;不仅能够为养老院的老人子女们跨越空间限制&#xff0c;实现与家人的情感连接&#xff0c;还可以…

Vditor集成于VUE笔记

文章目录 前言一、安装Vditor二、渲染markdown三、options3.1 自建CDN3.2 outline大纲不显示、不跳转问题3.3 upload 图片/视频上传3.4 toolbar提示位置点击事件more中文字 3.5 sv分屏渲染模式隐藏编辑框3.6 after中的insertValue或者setValue 前言 Vditor是一款易于使用的 Ma…

带你手撕红黑树! c++实现 带源码

目录 一、概念 二、特性 三、接口实现 1、插入 情况一&#xff1a;p为黑&#xff0c;结束 情况二&#xff1a;p为红 1&#xff09;叔叔存在且为红色 2&#xff09;u不存在/u存在且为黑色 &#xff08;1&#xff09;p在左&#xff0c;u在右 &#xff08;2&#xff09;…

MySQL中JOIN连接的实现算法

目录 嵌套循环算法&#xff08;NLJ&#xff09; 简单嵌套循环&#xff08;SNLJ&#xff09; 索引嵌套循环&#xff08;INLJ&#xff09; 块嵌套循环&#xff08;BNLJ&#xff09; 三种算法比较 哈希连接算法&#xff08;Hash Join&#xff09; 注意事项&#xff1a; 工…

异常处理/CC++ 中 assert 断言 应用实践和注意事项

文章目录 概述assert 本质浅析Release版本下的assert是否生效默认设置下 QtCreator环境 assert 过程默认配置下 VS环境 assert 过程配置VS发布模式下的断言生效VS环境Release版本的UI程序Release下请当我不生效 请勿滥用assert导致逻辑错误再强调不要在assert内执行逻辑功能怎敢…

【UnityRPG游戏制作】Unity_RPG项目_PureMVC框架应用

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

Vue-watch监听器

监听器 watch侦听器&#xff08;监视器&#xff09;简单写法完整写法 watch侦听器&#xff08;监视器&#xff09; 作用&#xff1a;监视数据变化&#xff0c;执行一些业务逻辑或异步操作 语法&#xff1a; watch同样声明在跟data同级的配置项中简单写法&#xff1a; 简单类型…

C++ 中的 lambda 表达式

1.概念 lambda表达式实际上是一个匿名类的成员函数&#xff0c;该类由编译器为lambda创建&#xff0c;该函数被隐式地定义为内联。因此&#xff0c;调用lambda表达式相当于直接调用匿名类的operator()函数&#xff0c;这个函数可以被编译器内联优化&#xff08;建议&#xff0…

地图涟漪效果

参考API echarts图表集 useEcharts.js import { onBeforeUnmount, onDeactivated } from "vue"; // import * as echarts from "echarts";/*** description 使用 Echarts (只是为了添加图表响应式)* param {Element} myChart Echarts实例 (必传)* param …

AcWing-168生日蛋糕-搜索/剪枝

题目 思路 表面积和体积公式&#xff1a;以下分析参考自&#xff1a;AcWing 168. 生日蛋糕【图解推导】 - AcWing&#xff1b;AcWing 168. 关于四个剪枝的最清楚解释和再次优化 - AcWing 代码 #include<iostream> #include<cmath> using namespace std;const in…

【爬虫基础1.1课】——requests模块上

目录索引 requests模块的作用&#xff1a;实例引入&#xff1a; 特殊情况&#xff1a;锦囊1&#xff1a;锦囊2: 这一个栏目&#xff0c;我会给出我从零开始学习爬虫的全过程。感兴趣的小伙伴可以关注一波&#xff0c;用于复习和新学都是不错的选择。 那么废话不多说&#xff0c…

C语言学习(九)多文件编程 存储类型 结构体

目录 一、多文件编程&#xff08;一&#xff09;不写头文件的方方式进行多文件编程 &#xff08;二&#xff09;通过头文件方式进行多文件编程&#xff08;1&#xff09;方法&#xff08;2&#xff09;头文件守卫 &#xff08;三&#xff09; 使用多文件编程实现 - * / 功能 二…