猿创征文 |【算法面试入门必刷】动态规划-线性dp(四)

这篇具有很好参考价值的文章主要介绍了猿创征文 |【算法面试入门必刷】动态规划-线性dp(四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

【算法入门必刷】数据结构-栈篇系列文章:
【算法入门必刷】数据结构-栈(一)
【算法入门必刷】数据结构-栈(二)
【算法入门必刷】数据结构-栈(三)
【算法入门必刷】数据结构-栈(四)
【算法入门必刷】数据结构-栈(五)

【算法入门必刷】动态规划-线性dp篇系列文章:
【算法面试入门必刷】动态规划-线性dp(一)
【算法面试入门必刷】动态规划-线性dp(二)
【算法面试入门必刷】动态规划-线性dp(三)

前言

开启刷题,请点击右边链接进行跳转点击这里

猿创征文 |【算法面试入门必刷】动态规划-线性dp(四),# 牛客网面试必刷,算法,动态规划,职场和发展,面试,最长上升子序列

算法入门刷题训练

题目AB37:最长上升子序列(一)

题目分析

描述
给定一个长度为 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解题步骤:

  1. 首先要确定dp数组:是一维,二维还是三维;以及下标的含义是什么?
  2. 根据确定好的dp数组,给出递推公式,也叫状态转移方程。
  3. 确定dp数组是否需要初始化,初始化为多少。
  4. 确定遍历的顺序;这一步在背包相关的DP题目中非常重要。
  5. 根据测试用例进行验证

题解

具体的解决方案如下:

  1. 首先确定dp数组:是一维,二维还是三维;以及下标的含义是什么?
// 这里使用一维dp
// dp[i] 表示以第i个数字为结尾的最长连续子序列的长度
vector<int> dp(n);
  1. 根据确定好的dp数组,给出递推公式。
// 根据题目分析得出了以下递推公式:
// 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;
  1. 确定dp数组是否需要初始化,初始化为多少。
// 根据dp[i]的定义,子序列的最短长度都是本身即1
vector<int> dp(n,1);
  1. 确定遍历的顺序;这一步在背包相关的DP题目中非常重要。
// 本题从小到大遍历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]);
        }
    }    
}
  1. 根据测试用例进行验证:选择所有的测试用例带入验证即可。

  2. 完整代码如下:

#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")

当提交成功后,会展示如下界面,那么恭喜这道题目就通过了!
猿创征文 |【算法面试入门必刷】动态规划-线性dp(四),# 牛客网面试必刷,算法,动态规划,职场和发展,面试,最长上升子序列

小结

祝愿所有的伙伴都能拿到自己心仪的Offer!📣伙伴们点击右边链接立刻开启刷题吧:牛客——刷题网文章来源地址https://www.toymoban.com/news/detail-781077.html

到了这里,关于猿创征文 |【算法面试入门必刷】动态规划-线性dp(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法自学__线性动态规划

    某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此

    2023年04月09日
    浏览(40)
  • C++动态规划-线性dp算法

    莫愁千里路 自有到来风 CSDN 请求进入专栏                                    X 是否进入《 C++ 专栏》? 确定 目录  线性dp简介 斐波那契数列模型  第N个泰波那契数 思路: 代码测试:  三步问题 思路: 代码测试: 最小花费爬楼梯 思路: 代码测试:  路径问题 数字三

    2024年02月19日
    浏览(47)
  • 算法基础复盘笔记Day10【动态规划】—— 线性DP

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 1. 题目

    2023年04月21日
    浏览(82)
  • acwing算法基础之动态规划--线性DP和区间DP

    线性DP:状态转移表达式存在明显的线性关系。 区间DP:与顺序有关,状态与区间有关。 题目1 :数字三角形。 解题思路:直接DP即可, f[i][j] 可以来自 f[i-1][j] + a[i][j] 和 f[i-1][j-1] + a[i][j] ,注意 f[i-1][j] 不存在的情况(最后一个点)和 f[i-1][j-1] 不存在的情况(第一个点)。

    2024年02月04日
    浏览(51)
  • C/C++ 动态规划面试算法题

    https://blog.csdn.net/qq_41277628/article/details/113322136 输入:[7,1,5,3,6,4] 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。 给定

    2024年02月07日
    浏览(38)
  • 猿创征文 | Shell编程【上篇】

    目录 1,Shell编程 1.1:简介 1.1.1:shell解释器 1.2:快速入门 1.2.1:编写脚本 1.2.2:执行shell脚本 1.3:shell变量 1.3.1:简介 1.3.2:使用变量 1.3.3:删除变量 1.3.4:只读变量  1.4:字符串 1.4.1:单引号 1.4.2:双引号  1.4.3:获取字符串长度   1.4.4:提取子字符串  1.5:传递参数 1

    2024年02月02日
    浏览(59)
  • 猿创征文 |【Linux】常用命令

    🍁 博客主页: 👉@不会压弯的小飞侠 ✨ 欢迎关注: 👉 点赞 👍 收藏 ⭐ 留言 ✒ ✨ 系列专栏: 👉Linux专栏 ✨ 欢迎加入社区: 👉不会压弯的小飞侠 ✨ 人生格言:知足上进,不负野心。 🔥 欢迎大佬指正,一起学习!一起加油! command [-options] [parameter] command:命令名 [-o

    2024年01月16日
    浏览(39)
  • 猿创征文| redis基本数据类型

    📃个人主页:不断前进的皮卡丘 🌞博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记 🔥个人专栏:微服务专栏 ✔️redis常见的操作命令:http://www.redis.cn/commands.html 命令 功能 keys * 查看当前库的所有key exists key 判断

    2023年04月08日
    浏览(42)
  • 以太坊是什么?|猿创征文

    以太坊是一个可编程、可视化、更易用的区块链,它允许任何人编写智能合约和发行代币。 在以太坊(Ethereum)出现之前,各种区块链应用的功能非常有限,例如,比特币和其他加密货币都只是纯粹的数字货币。 以太坊(Ethereum)创始人Vitalik Buterin将以太坊(Ethereum)设想为开发人员

    2024年02月02日
    浏览(73)
  • 猿创征文|【HTML】标签学习之路

    💖 目录 一、HTML语法规范 1.基本语法概述 2.标签关系 二、HTML基本结构标签 1.第一个HTML页面 2.HTML基本结构标签总结 1.基本语法概述 html是由尖括号包围的,列如: html 。 html标签通常是成对出现的,列如:html和/html,我们称为 双标签 。标签对里的第一个标签是开始标

    2024年01月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包