最长上升子序列模型——AcWing 272. 最长公共上升子序列

最长上升子序列模型

定义

给定一个序列,如整数序列或字符序列,最长上升子序列是指其中最长的子序列,满足子序列中的元素依次递增。最长上升子序列模型是一种在给定序列中寻找最长上升子序列的问题模型。

运用情况

  • 该模型常用于解决与序列相关的优化问题,例如在一个数字序列中找到最长的递增子序列。
  • 它可以应用于各种领域,如计算机科学、数学、生物学等。

注意事项

  • 定义明确的状态表示:确保状态能够准确地描述问题的特征。
  • 正确的状态转移方程:根据问题的逻辑,推导出合理的状态转移方程。
  • 边界情况的处理:考虑序列的起始和结束位置,以及特殊情况的处理。
  • 子序列不要求连续:最长上升子序列中的元素不一定是原始序列中连续的元素。
  • 可能存在多个最长上升子序列:一个序列可能有多个长度相同的最长上升子序列。
  • 算法效率:求解最长上升子序列的算法有多种,不同算法的时间复杂度和空间复杂度可能不同。

解题思路

  • 定义状态:一般使用一个一维或二维数组来表示状态。
  • 建立状态转移方程:根据问题的要求,确定如何从一个状态转移到另一个状态。
  • 初始化状态:设置初始值,通常为边界情况或基本情况。
  • 按照状态转移方程进行计算:通过迭代或递归的方式,根据已知状态计算出其他状态的值。
  • 最终答案的确定:根据问题的要求,从最终的状态中得出答案。
  • 动态规划:这是一种常见的解决最长上升子序列问题的方法。通过维护一个辅助数组dp,其中dp[i]表示以第i个元素结尾的最长上升子序列的长度。然后,根据当前元素与之前元素的关系,更新dp数组的值。
  • 二分查找:在一些情况下,可以使用二分查找来优化动态规划的过程,提高算法效率。
  • 其他方法:除了动态规划,还可以使用其他方法来解决最长上升子序列问题,如贪心算法、分治算法等。

AcWing 272. 最长公共上升子序列

题目描述

AcWing 272. 最长公共上升子序列 - AcWing

运行代码

#include <iostream>
using namespace std;
const int N = 3010;
int n;
int a[N], b[N];
int f[N][N];
int main()
{
     cin >> n;
    for (int i = 1; i <= n; i ++ ) cin >> a[i];
    for (int i = 1; i <= n; i ++ ) cin >> b[i];
    for (int i = 1; i <= n; i ++ )
    {
        int maxv = 1;
        for (int j = 1; j <= n; j ++ )
        {
            f[i][j] = f[i - 1][j];
            if (a[i] == b[j]) f[i][j] = max(f[i][j], maxv);

            if (b[j] < a[i])
                maxv = max(maxv, f[i - 1][j] + 1);
        }
    }
    int res = 0;
    for (int i = 1; i <= n; i ++ ) res = max(res, f[n][i]);
    cout << res << endl;
    return 0;
}

代码思路

  • 定义了常量 N 表示序列的最大长度。
  • 输入两个序列 a 和 b 的长度 n 以及它们各自的元素。
  • f[i][j] 表示以 a 的前 i 个元素和 b 的前 j 个元素中最长公共上升子序列的长度。
  • 外层循环遍历 a 的元素。对于每个 i
    • 先初始化一个变量 maxv 为 1。
    • 内层循环遍历 b 的元素。对于每个 j
      • 首先将 f[i][j] 更新为上一行(即 i-1 行)对应位置的值,这是一种继承。
      • 如果当前 a[i] 等于 b[j],则更新 f[i][j] 为当前的 maxv,因为找到了一个公共上升元素。
      • 如果 b[j] 小于 a[i],则更新 maxv 为当前 maxv 和上一行对应位置值加 1 中的较大值,这是在计算以当前 b[j] 结尾的可能的更长的公共上升子序列长度。
  • 最后通过遍历 f[n][i] 找到整个数组中的最大值,即最长公共上升子序列的长度并输出。

改进思路

  1. 空间优化:可以观察到在计算 f[i][j] 时,实际上只用到了上一行的数据,所以可以考虑使用滚动数组来优化空间,将空间复杂度从 O(n^2) 降低到 O(n)
  2. 利用二分查找:在更新 maxv 时,可以考虑使用二分查找来更高效地找到满足条件的位置,而不是简单地线性遍历。
  3. 预处理一些信息:比如可以预先计算 b 序列中每个元素之前比它小的元素的个数等信息,以便在计算过程中能更快地做出判断和更新。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

44岁过气港姐晚晚熬通宵开直播,情路坎坷生两胎老公身份成迷

曾经的「9料」港姐冠军杨思琦近年将工作重心转向内地&#xff0c;狠心抛下一儿一女在香港&#xff0c;只身一人定居广州靠当主播维持生计。 相信有不少网友都留意到&#xff0c;杨思琦几乎晚晚都通宵直播&#xff0c;睡觉前看她在卖力劲歌热舞与其他直播主PK赚钱&#xff0c;一…

jenkins环境搭建--关于jenkins在Ubuntu下的安装篇(一)

在ubuntu下使用命令进行下载安装包&#xff1a; 关于jenkins的安装有多种&#xff0c;可以借助docker容器进行安装&#xff0c;也可以通过传统方法手动一步步的进行安装&#xff0c;以下介绍手动一步步的安装方法&#xff0c;后续我们将解释关于jenkins的相关配置以及实战使用…

Linux系统中文件权限详解

一、Linux文件权限设计 Linux系统中任何内容都可以用文件表示&#xff0c;其对文件设计了一套权限进行管理&#xff1b;文件权限共有11个字符&#xff0c;从左向右共分为5段&#xff08;每段的具体说明如下表Linux权限设计说明所示&#xff09;&#xff1a; Linux权限设计说明 …

基于SSM+Jsp的雅博书城在线系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP4141(SPI接口)的数字电位器Proteus仿真

一、仿真原理图: 二、运行效果: 三、软件部分: 1)、SPI读写: 2)、初始化部分: void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the CPU, AHB and APB busses clocks …

STM32存储左右互搏 模拟U盘桥接QSPI总线FATS读写FLASH W25QXX

STM32存储左右互搏 模拟U盘桥接QSPI总线FATS读写FLASH W25QXX STM32的USB接口可以模拟成为U盘&#xff0c;通过FATS文件系统对连接的存储单元进行U盘方式的读写。 这里介绍STM32CUBEIDE开发平台HAL库模拟U盘桥接Quad SPI总线FATS读写W25Q各型号FLASH的例程。 FLASH是常用的一种…

Pikachu靶场--SSRF

参考借鉴&#xff1a;pikachu靶场练习——SSRF详解_pikachu ssrf-CSDN博客 SSRF(curl) 先了解一下curl curl是一个非常实用的、用来与服务器之间传输数据的工具&#xff1b;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, PO…

C语言——链表专题

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

【算法专题--链表】旋转链表 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐解题思路---闭合为环 &#x1f34d; 案例图解 四、总结与提炼 五、共勉 一、前言 旋转链表 这道题&#xff0c;可以说是--链表专题--&#xff0c;最经典的一道题&#xff0c;也是在面试中频率最高的一道题目&#x…

Kotlin 中的内联函数

1 inline 内联函数&#xff1a;消除 Lambda 带来的运行时开销。 举例来说&#xff1a; fun main() {val num1 100val num2 80val result num1AndNum2(num1, num2) { n1, n2 ->n1 n2} }fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int …

APT 组织也在利用云存储进行攻击

研究人员发现&#xff0c;各类攻击者都在攻击行动中将恶意脚本、远控木马和诱饵文档等恶意文件上传到云服务器上&#xff0c;各种恶意文件组合起来完成恶意攻击。 某个攻击组织从发送钓鱼邮件到植入远控木马的过程如下所示&#xff1a; 攻击链 多个恶意文件串联起了整个攻击行…

跑路代码已上线,坐等删库中~

前言 或许大家会认为删库跑路都是运维或者DBA的事情&#xff0c;或许认为我没有线上数据库权限就不可能删库跑路。但是事实并非如此&#xff0c;建议大家仔细阅读此文章&#xff0c;赶紧排查下您的代码&#xff0c;很可能隐藏着这种删库程序。还是要呼吁大家&#xff0c;这个案…

三级医院智慧医院信息化规划方案(65页PPT)

方案介绍&#xff1a; 该方案通过信息化手段实现医院信息化全覆盖&#xff0c;优化诊疗流程、提高诊疗效率和准确性&#xff1b;同时实现医疗资源的合理配置和共享&#xff0c;提升医疗服务质量。通过优化患者就医流程、提供便捷的服务和宣传健康知识等方式提高患者满意度。通…

苏州大学气膜综合馆成为师生活动新中心—轻空间

苏州大学应用技术学院的气膜综合馆自建成以来&#xff0c;已成为校园内的热门活动场所。由轻空间&#xff08;江苏&#xff09;膜科技有限公司&#xff08;以下简称“轻空间”&#xff09;全力打造&#xff0c;这座现代化、环保的多功能运动场馆&#xff0c;不仅为师生提供了一…

代码随想录第35天|动态规划

理论基础 动态规划是由前一个状态推导出来的, 而贪心是局部直接选取最优 五部曲: 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 debug过程 : dp数组打印查看 509. 斐波那契数 参考 //动态规划的方法 …

Python基础教程——常用的36个经典案例!

Python 的简洁和强大使其成为许多开发者的首选语言。本文将介绍36个常用的Python经典代码案例。这些示例覆盖了基础语法、常见任务、以及一些高级功能。(文末附带精品学习资料) 1. 列表推导式 fizz_buzz_list [ "FizzBuzz" if i % 15 0 else "Fizz&qu…

陪玩系统源码,陪玩平台源码,陪玩app源码搭建

游戏陪玩app开发&#xff0c;软件搭建&#xff0c;程序制作、系统设计 目前&#xff0c;中国约有五到六亿游戏玩家&#xff0c;其中大约有两亿人选择付费游戏。这显示了绝大多数玩家都愿意为他们喜欢的游戏付费。随着游戏体验的不断改善&#xff0c;越来越多的玩家更倾向于找到…

基于Java的汽车租赁系统【附源码】

论文题目 设计&#xff08;论文&#xff09;综述&#xff08;1000字&#xff09; 当今社会&#xff0c;汽车租赁已成为一种受欢迎的出行方式。本文旨在探讨汽车租赁行业的发展趋势、市场规模及其对环境的影响。目前&#xff0c;汽车租赁行业正在经历着快速的发展。随着经济的发…

3D资产爆发,轻量化需求再度冲高,见证下一代3D崛起!

数字经济不断发展&#xff0c;3D资产和实体经济迎来深度融合的窗口期&#xff0c;3D资产应用外延催生大量新场景、新业态&#xff0c;一个3D资产构建的数字世界正出现在我们眼前。 数字经济不断发展&#xff0c;3D资产和实体经济迎来深度融合的窗口期&#xff0c;3D资产应用外…

【TB作品】MSP430,G2533单片机,红外发射,红外接收,红外通信,IR发射

文章目录 题目红外NEC协议介绍基本概述数据帧结构位表示数据传输示例重复码&#xff08;Repeat Code&#xff09;实现细节发送端接收端 典型应用结论 最终效果代码 题目 遥控器 硬件&#xff1a;msp430g2553、oled显示器、ds18b20温度传感器、红外发射器、按键 软件功能&#…