刷题之动态规划-子序列

前言

大家好,我是jiantaoyab,开始刷动态规划的子序列类型相关的题目,子序列元素的相对位置和原序列的相对位置是一样的

动态规划5个步骤

  1. 状态表示 :dp数组中每一个下标对应值的含义是什么>dp[i]表示什么
  2. 状态转移方程: dp[i] 等于什么
  3. 1 和 2 是动态规划的核心步骤,第三步是初始化,保证填表的时候不越界
  4. 填表顺序:为了保证填写当前状态的时候,所需要的状态已经计算过
  5. 返回值

最长递增子序列

image-20240403095425098

题目分析

image-20240403105502701

代码

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();vector<int> dp(n, 1);int ret = 1;for(int i = 1; i < n; i++){for(int k = 0; k < i; k++){if(nums[k] < nums[i])dp[i] = max(dp[k] + 1, dp[i]);}ret = max(ret, dp[i]);}return ret;}
};

摆动序列

image-20240404090127835

代码

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int n = nums.size();vector<int> f(n, 1); vector<int> g(n, 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] = max(f[i],  g[j] + 1); else if(nums[j] > nums[i])//递减 g[i] = max(g[i],  f[j] + 1);}   ret = max(f[i], g[i]);}return ret ;}
};

最长递增子序列的个数

image-20240404094248815

题目分析

image-20240404102615870

代码

class Solution {
public:int findNumberOfLIS(vector<int>& nums) {int n = nums.size();vector<int> len(n, 1);vector<int> count(n, 1);int ret_len = 1, ret_count = 1;for(int i = 1; i < n; i++){for(int k = 0; k < i; k++){if(nums[k] < nums[i]) {if(len[k] + 1 == len[i]) count[i] += count[k];else if(len[k] + 1 > len[i]){len[i] = len[k] + 1 ; count[i] = count[k];}}                 }//更新返回值if(ret_len == len[i]) ret_count += count[i];else if(ret_len < len[i]) ret_len = len[i], ret_count = count[i];}return  ret_count;}
};

最长数对链

image-20240404103433761

题目分析

dp[i]: 表示以i位置为结尾的最长数对链的长度

在(0,i-1)中取一个j,是数对链的话得满足pairs[j] [1] < pairs[i] [0]

代码

class Solution {
public:int findLongestChain(vector<vector<int>>& pairs) {int m = pairs.size();vector<int> dp (m, 1);sort(pairs.begin(), pairs.end());int ret = 1;for(int i = 1; i < m; i++){for(int j = 0; j < i; j++){if(pairs[j][1] < pairs[i][0])dp[i] = max(dp[j] + 1, dp[i]);}ret = max(ret, dp[i]);}return ret;}
};

最长定差子序列

image-20240405082954751

题目分析

image-20240405090140474

代码

class Solution {
public:int longestSubsequence(vector<int>& arr, int difference) {int n  = arr.size();unordered_map<int, int> hash; //<arr[i], dp[i]>int ret = 1;//初始化hash[arr[0]] = 1;for(int i = 1; i < n; i++){hash[arr[i]] = hash[arr[i] - difference] + 1;ret = max(ret, hash[arr[i]]);}return ret;}
};

最长的斐波那契子序列的长度

image-20240406175144571

题目分析

image-20240406185244342

代码

class Solution {
public:int lenLongestFibSubseq(vector<int>& arr) {int n = arr.size();vector<vector<int>> dp(n, vector<int>(n, 2));unordered_map<int, int> hash;//将arr中的值和下标绑定起来for(int i = 0; i < n; i++) hash[arr[i]] = i;int ret = 2;for(int j = 2; j < n; j++) //固定最后一个位置{for(int i = 1; i < j; i++) //固定倒数第二个位置{int x = arr[j] - arr[i];if(hash.count(x) && x < arr[i]) {dp[i][j] = dp[hash[x]] [i]+ 1;ret = max(ret, dp[i][j]);}}}return ret < 3 ?  0  : ret;}
};

最长等差数列

image-20240407082524850

题目分析

image-20240407091840789

代码

class Solution {
public:int longestArithSeqLength(vector<int>& nums) {int n = nums.size();unordered_map<int, int> hash; //放nums元素对应的下标hash[nums[0]] = 0;int ret = 2;vector<vector<int>> dp(n,  vector<int>(n, 2));for(int i = 1; i < n; i++) //固定倒数第2个数{for(int j = i + 1; j < n; j++) //依次枚举倒数第一个数{int x = 2 * nums[i]  - nums[j];if(hash.count(x)) dp[i][j] = dp[hash[x]][i] + 1;ret = max(ret,  dp[i][j]);}hash[nums[i]] = i;}return ret;}
};

等差数列划分 II - 子序列

image-20240407092146451

题目分析

image-20240407100137814

代码

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();unordered_map<long long, vector<int>> hash; //存放nums元素对应的下标for(int i = 0; i < n; i++) hash[nums[i]].push_back(i); //每个元素的下标可能有多个vector<vector<int>> dp(n, vector<int>(n));int ret = 0;for(int j = 2; j < n; j++) //固定最后一个位置{for(int i = 1; i < j; i++) //依次遍历倒数第二个位置{long long x = (long long)2 * nums[i] - nums[j];if(hash.count(x)) {//提取出nums[i]的下标for(auto k : hash[x]){if(k < i) dp[i][j] += dp[k][i] + 1;}}ret += dp[i][j];}}return ret;}
};

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

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

相关文章

RuoYi-Cloud下载与运行

一、源码下载 若依官网:RuoYi 若依官方网站 鼠标放到"源码地址"上,点击"RuoYi-Cloud 微服务版"。 跳转至Gitee页面,点击"克隆/下载",复制HTTPS链接即可。 源码地址为:https://gitee.com/y_project/RuoYi-Cloud.git 点击复制 打开IDEA,选…

千万不要错过这6款能让你快速写作成长的宝藏软件…… #学习方法#AI写作

国外ChatGPT爆火&#xff0c;AI写作在国内也引起不小的瞩目&#xff0c;目前国内的AI写作工具少说也有几十上百个&#xff0c;要在这么多AI写作中找出适合自己的工具&#xff0c;一个一个尝试是不太现实的&#xff0c;所以今天就给大家推荐一些款AI写作工具。帮助你少走弯路&am…

开源AI程序员SWE-Agent的实现方法

1 引子 前几天&#xff0c;AI 编程机器人 Devin 引起了热议。传言称&#xff1a;程序员的饭碗就要丢了。这两天&#xff0c;一个类似功能的产品 SWE-Agent 开源&#xff0c;在 SWE-Bench 上实现了与 Devin 类似的效果。下面让我们来看看 AI 程序员的具体实现方法。 2 信息 地…

unicloud中文字段排序bug

db.collection(ledy-db).field( "序号,客户名称,期初余款,折扣,收款日期,收款金额,赠送金额,备注1,订单日期,订单金额,备注2,备注3,余款,老师).orderBy(客户名称).get()中文字段排序查不出数据 然后只能用使用原生云函数的sort方法来排序 云数据库聚合操作aggregate | u…

抖音电商罗盘品牌人群运营策略指南

【干货资料持续更新&#xff0c;以防走丢】 抖音电商罗盘品牌人群运营策略指南 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 抖音运营资料合集&#xff08;完整资料包含以下内容&#xff09; 目录 品牌人群运营策略&#xff0c;旨在帮助品牌通过精细化运营提…

深入理解MySQL中的utf8、utf8mb4和排序规则

在MySQL中,字符集和排序规则是两个非常重要的概念,它们决定了数据库如何存储和比较字符串数据。今天我们来探讨一下MySQL中几种常用的字符集和排序规则之间的区别和适用场景。 utf8和utf8mb4 utf8和utf8mb4都是MySQL中用于存储Unicode字符的字符集编码。但是它们有一个重要区…

sql 之 索引

索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;使用索引可快速访问数据库表中的特定信息。 1. 什么是索引 官方上面说索引是帮助MySQL高效获取数据的数据结构&#xff0c;通俗点来说&#xff0c;数据库索引就像是是一本书的目录&#xff0c;可以直接根据页码…

深度学习笔记【订阅前必读】

一、同款pdf版本笔记使用情况 pytorch深度学习&#xff08;共计169页&#xff0c;基于本人听完B站小土堆PyTorch深度学习快速入门教程所写&#xff09; 发现这一份B站小土堆Pytorch深度学习笔记连985、211等高校同学都在使用(语雀在线版&#xff0c;笔记带评论) 二、笔记获取优…

vscode连接远程服务器一直需要输密码,但是连不上

问题&#xff1a;vscode连接远程服务器一直需要输密码&#xff0c;但是连不上。 解决办法&#xff1a;kill 掉该远程服务器&#xff0c;然后再重新连接 操作&#xff1a; windows: ctrlshiftp mac:cmdshiftp 调出指令&#xff0c;然后选择“Remote SSH:Kill Vscode Serve…

【代码随想录】day37:递增数字,监控二叉树

递增数字 def monotoneIncreasingDigits(self, n):""":type n: int:rtype: int"""# 找到不递增的位置i对应的数字k&#xff0c;前一个数字-1,后面都变为9&#xff0c;# 后序遍历nlist(str(n))for i in range(len(n)-1,0,-1):# 如果不递增if n[i]…

SpringMVC--概述 / 入门

目录 1. SpringMVC简介 2. 配置&入门 2.1. 开发环境 2.2. 创建maven工程 2.3. 手动创建 web.xml 2.4. 配置web.xml 2.4.1. 默认配置方式 2.4.2. 扩展配置方式 2.5. 创建请求控制器 2.6. 创建springMVC的配置文件 2.7. 测试 HelloWorld 2.7.1. 实现对首页的访问…

基于java+springboot+vue实现的教学辅助系统(文末源码+Lw)23-225

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

如何在Linux中安装NVM(Node Version Manager)

NVM&#xff08;Node Version Manager&#xff09;是一个命令行工具&#xff0c;允许您轻松在同一台计算机上安装和管理多个版本的Node.js。它是Node.js开发者的神器&#xff0c;特别适用于需要在不同项目间切换Node.js版本的场景。下面是在Linux系统上安装NVM的详细步骤&#…

健康元 穿越周期看底色

中国创新药正在迈进2.0时代。 进入2024年之后&#xff0c;越来越多的国内创新药企开始主动调整研发管线&#xff0c;缩减研发开支&#xff0c;甚至是直接被“溢出”了市场。 在“风向标”的融资端&#xff0c;过去的2023年也是中国创新药融资市场连续第二年出现一二级市场融资…

启航IT行业:零基础者的入门指南

随着数字化转型成为全球趋势&#xff0c;IT行业的需求日益增长&#xff0c;吸引了大量寻求职业转型的人群。对于那些没有任何相关背景的人来说&#xff0c;踏入IT的大门可能看起来不易&#xff0c;但是通过一些明智的策略和持续的努力&#xff0c;实现这一跳跃并非遥不可及。以…

python教程(4更新中)

单元测试 如果你听说过“测试驱动开发”&#xff08;TDD&#xff1a;Test-Driven Development&#xff09;&#xff0c;单元测试就不陌生。 单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。 比如对函数abs()&#xff0c;我们可以编写出以下几个测…

逆向入门:为CTF国赛而战day03

今天来做几道题目。 环境准备&#xff1a;ida ,Exeinfo,万能脱壳器&#xff08;后面有写资源&#xff09; 强推&#xff0c;亲测有效CTF小工具下载整理_ctf工具御剑下载-CSDN博客 [网站BUUCTF] 目录 题目一 题目二三 题目4&#xff1a;新年快乐 题目一 easyre题解_easyr…

电脑硬件 - 硬盘

硬盘是一台电脑的数据中心&#xff0c;存放着我们用户的所有文件和数据 对于一块硬盘&#xff0c;其重要指标&#xff1a;顺序读写能力&#xff0c;随机读写能力 顺序读写影响大文件的拷贝&#xff0c;随机读写影响大量小文件的拷贝&#xff08;打开软件的快慢&#xff09; 因…

【算法详解】双指针

双指针 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff0c;一种是左右指针。 1. 双指针简介 双指针&#xff08;Two Pointers&#xff09;&#xff1a;指的是在遍历元素的过程中&#xff0c;不是使用单个指针进行访问&#xff0c;而是使用两个指针进行访问&#…

vue2转vue3一些属性使用方法总结 (持续更新中)

1.vue3中不再需要用this.$set 方法 在 Vue 3 中&#xff0c;this. s e t 方法不再存在&#xff0c;因为 V u e 3 使用了 P r o x y 来实现其响应式系统&#xff0c;使得对象的属性访问和修改都能够被自动追踪。因此&#xff0c;在 V u e 3 中&#xff0c;你通常不需要使用特殊的…