【算法面试入门必刷】动态规划-线性dp(四)
📦个人主页:一二三o-0-O的博客
🏆技术方向:C/C++客户端资深工程师(直播+音视频剪辑)
👨💻作者简介:数据结构算法与音视频领域创作者
📒 系列专栏:牛客网面试必刷
📣专栏目标:帮助伙伴们通过系统训练,掌握数据结构与算法,收获心仪Offer
📝推荐一个找工作神器:牛客刷题网 【面试经验|实习招聘内推,求职就业一战解决】
🧡如果对您有帮助的话,欢迎点赞👍收藏📂,关注不迷路
【算法入门必刷】数据结构-栈篇系列文章:
【算法入门必刷】数据结构-栈(一)
【算法入门必刷】数据结构-栈(二)
【算法入门必刷】数据结构-栈(三)
【算法入门必刷】数据结构-栈(四)
【算法入门必刷】数据结构-栈(五)
【算法入门必刷】动态规划-线性dp篇系列文章:
【算法面试入门必刷】动态规划-线性dp(一)
【算法面试入门必刷】动态规划-线性dp(二)
【算法面试入门必刷】动态规划-线性dp(三)
开启刷题,请点击右边链接进行跳转点击这里

描述
给定一个长度为 n 的数组 arr,求它的最长严格上升子序列的长度。
所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组。例如 [1,5,3,7,3] 数组,其子序列有:[1,3,3]、[7] 等。但 [1,6]、[1,3,5] 则不是它的子序列。
我们定义一个序列是 严格上升 的,当且仅当该序列不存在两个下标 i 和 j 满足 i<j 且 arr i ≥ arr j.
这道题目与上一篇【算法面试入门必刷】动态规划-线性dp(三)中练习的连续子数组最大和有个不同就是,要求的子数组不是连续的。因此可以定义动态规划数组dp[i] 表示以第i个数字为结尾的最长连续子序列的长度。从而推导出递推公式:dp[i] = maxLength + 1,其中maxLength表示从下标0到i-1中dp数组最大值(最大的连续子序列的长度)。
任何算法都有相对应的算法模板或者有规律的解题步骤。对于动态规划来讲,做DP相关的算法题要熟练掌握下面DP解题步骤,这样有助于在面对到各种各样的题目时能够提高解题效率:
DP解题步骤:
- 首先要确定dp数组:是一维,二维还是三维;以及下标的含义是什么?
- 根据确定好的dp数组,给出递推公式,也叫状态转移方程。
- 确定dp数组是否需要初始化,初始化为多少。
- 确定遍历的顺序;这一步在背包相关的DP题目中非常重要。
- 根据测试用例进行验证
具体的解决方案如下:
// 这里使用一维dp
// dp[i] 表示以第i个数字为结尾的最长连续子序列的长度
vector<int> dp(n);
// 根据题目分析得出了以下递推公式:
// dp[i] = maxLength + 1,其中maxLength表示从下标0到i-1中dp数组最大值(当前值之前的最大的连续子序列的长度)。
int maxValue{};
// 求得从下标0到下标i-1中dp值的最大值
for(int j{};j<i;++j){
// 当当前值大于v[j],才进行dp[j]的判断
if(v[i] > v[j]){
maxValue = max(maxValue,dp[j]);
}
}
// 然后dp[i]就等于之前的最大的连续子序列的长度加上当前数值
dp[i] = maxValue + 1;
// 根据dp[i]的定义,子序列的最短长度都是本身即1
vector<int> dp(n,1);
// 本题从小到大遍历i
for(int i{1};i<n;++i){
int maxValue{};
// 内部从小到大,从大到小都可以
for(int j{};j<i;++j){
if(v[i] > v[j]){
maxValue = max(maxValue,dp[j]);
}
}
}
根据测试用例进行验证:选择所有的测试用例带入验证即可。
完整代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> v(n);
for(int i{};i<n;++i) cin >> v[i];
// dp[i] 表示以第i个数字为结尾的最长连续子序列的长度
vector<int> dp(n,1);
int result{};
for(int i{1};i<n;++i){
int maxValue{};
for(int j{};j<i;++j){
if(v[i] > v[j]){
maxValue = max(maxValue,dp[j]);
}
}
dp[i] = maxValue + 1;
if(dp[i] > result) result = dp[i];
}
cout << result << endl;
return 0;
}
// 64 位输出请用 printf("%lld")
// 64 位输出请用 printf("%lld")
当提交成功后,会展示如下界面,那么恭喜这道题目就通过了!

祝愿所有的伙伴都能拿到自己心仪的Offer!📣伙伴们点击右边链接立刻开启刷题吧:牛客——刷题网
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟
我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]