最长上升子序列 最长公共子序列

最长上升子序列 (LIS) 详解+例题模板 (全) 欢迎访问https://blog.youkuaiyun.com/lxt_Lucia~~ 宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗~~ ------------------------------------我只是一条可爱哒分界线-------------------------------------- 1.摘要: 关... 阅读详情

最长上升子序列为DP问题,所以我们可以用DP来解决。它有两种算法,首先介绍一下
时间复杂度为O(n^2):
递推关系:dp[i]={1,d[j]+1|j<i且aj<ai}
dp[]:=以ai为末尾的最长上升子序列的长度
而以ai结尾的上升子序列是:
(1)只包含ai的子序列
(2)在满足j<i并且aj<ai的以aj为结尾的上升子列末尾,追加上ai后得到的子序列。
我们依次遍历整个序列,每一次求出从第一个数到当前这个数的最长上升子序列,直至遍历到最后一个数字为止,然后再取dp数组里最大的那个即为整个序列的最长上升子序列。我们用dp[i]来存放序列1-i的最长上升子序列的长度,那么dp[i]=max(dp[j])+1,(j∈[1, i-1]); 显然dp[1]=1,我们从i=2开始遍历后面的元素即可。
代码如下:

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <cstring>
using namespace std;

const int N=1e6;
int n,a[N],dp[N];


void f()  //求最长上升子序列
{
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        dp[i]=1;
        for(int j=1;j<=n;j++)
            if(a[j]<a[i])
              dp[i]=max(dp[i],dp[j]+1);
        ans=max(dp[i],ans);
    }
    cout<<ans<<endl;
}

int main()
{
    memset(a,0,sizeof(a));
    memset(dp,0,sizeof(dp));
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    f();
    return 0;
}

时间复杂度为O(nlogn):
必需满足条件:dp数列中除INF之外是单调递增的
最开始初始话dp为inf。然后由前向后逐个考虑数列的元素,对于每个aj,如果i=0或者dp[i-1]<aj的话,就用dp[i]=min(dp[i],aj)进行更新,最终找出使得dp[i]

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <cstring>
using namespace std;

const int N=1e6;
const int inf=0x3f3f3f3f;
int n,a[N],dp[N];


void f()  //lower_bound()为二分函数,详情请见二分法那篇博客
{
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        *lower_bound(dp+1,dp+n+1,a[i])=a[i];
    }
    cout<<lower_bound(dp+1,dp+n+1,inf)-dp-1<<endl;
}

int main()
{
    memset(a,0,sizeof(a));
    memset(dp,inf,sizeof(dp));
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    f();
    return 0;
}

另一种二分:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define MAXN 40005
using namespace std;
int arr[MAXN],ans[MAXN],len;
int main()
{
    int n;
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n;
        for(int i=1; i<=n; ++i)
            scanf("%d",&arr[i]);
        ans[1] = arr[1];
        len=1;
        for(int i=2; i<=n; ++i)
        {
            if(arr[i]>ans[len])
                ans[++len]=arr[i];
            else
            {
                int pos=lower_bound(ans,ans+len,arr[i])-ans;
                ans[pos] = arr[i];
            }
        }
        cout<<len<<endl;
    }
    return 0;
}

最长公共子序列
引进一个二维数组dp[][],用dp[i][j]记录s[i]与t[j] 的LCS 的长度.
我们是自底向上进行递推计算,那么在计算dp[i,j]之前,dp[i-1][j-1],dp[i-1][j]与dp[i][j-1]均已计算出来。此时我们根据s[i] = t[j]还是s[i] != t[j],就可以计算出dp[i][j]。

问题的递归式写成:这里写图片描述
回溯输出最长公共子序列过程:
这里写图片描述

首先做初始化。将c[0][i]和从c[i][0]初始化为0,然后一行一行的填表。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=1e6;
int dp[500][500];
char s[1000],t[1000];
int n,m;

void f()
{
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        if(s[i]==t[j])
            dp[i+1][j+1]=dp[i][j]+1;
        else
            dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
    cout<<dp[n][m]<<endl;
}


int main()
{
    scanf("%s%s",s,t);
    n=strlen(s);
    m=strlen(t);
    f();
    return 0;
}
动态规划 最长公共子序列 过程图解 1.基本概念       首先需要科普一下,最长公共子序列(longest common sequence)和最长公共子串(longest common substring)不是一回事儿。什么是子序列呢?即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。什么是子串呢?给定串中任意个连续的字符组成的子序列称为该串的子串。给一个图再解释一下:        如 阅读详情

相关推荐

动态规划——最长上升子序列模型

动态规划——最长上升子序列模型

pangyou3s的博客 2432

最长公共子序列

动态规划:最长公共子序列,代码及其填写dp表格详解

北渡的博客 1万+

模板 - 最长上升子序列与最长公共子序列

整理的算法模板合集: ACM模板 目录1.最长上升子序列(LIS)1.1树状数组优化O(nlogn)O(nlogn)O(nlogn)2.最长公共子序列(LCS)2.1转换成LIS优化O(nlogn)O(nlogn)O(nlogn) 1.最长上升子序列(LIS) 给出一个⻓度为n的数字序列ai{ai}ai,我们需要找到一个最⻓的子序列, 使得子序列中的数字大小单调递增。 例如:n=5n = 5n=5,原序列为(1,4,2,3,5)(1,4,2,3,5)(1,4,2,3,5),那么我们选择(1,2,3,5)(

繁凡さん的博客 3559

最长上升子序列(序列长度+序列输出)

一、LIS的定义: 最长上升子序列(Longest Increasing Subsequence),简称LIS,也有些情况求的是最长非降序子序列,二者区别就是序列中是否可以有相等的数。假设我们有一个序列 b i,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们也可以从中得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N,但必

时光、疏离了记忆づ童话的博客 9219

浅谈最长上升子序列和最长公共子序列(含n²优化)

听大佬们解释,最长 上升 / 下降 子序列和最长公共子序列属线性DP范畴,由于本人还没有系统的对DP进行研究,所以这里就暂时先不阐述线性DP了。 最长 上升 / 下降 子序列和最长公共子序列这两类问题是非常典型的DP类型的题目,每一个算法学习书上面都少不了这两类问题,相关的题目也有很多,如: 导弹拦截 最长公共子序列 类似的题目还有很多,就不一 一举例了。 O(n²)解决最长上升子序列 以时间复杂度O(n²)解决最长上升子序列问题是最简单也是最常见的一种解法, ...

m0_55759099的博客 659

最长上升子序列/子串和最长公共子序列/子串

文章目录子序列(不连续)最长上升子序列(暴力回溯)(动规)(动规 + 二分 + 贪心)(动规 + 二分 + 贪心)化简版最长公共子序列(动规)(动规)子序列(连续)最长连续上升子序列(动规)(双指针)最长公共子数组 (动规)(动规 一维数组优化)(滑动窗口 待更新) 子序列(不连续) <span id = “最长上升子序列">最长上升子序列 LIS(longest increasing subsequence)是最经典的动态规划题目之一,因为它的递推公式很有条理,可以很清楚的告诉我们什么状态可以

_zhy_cq 1306

最长上升子序列和最长公共子序列

文章目录 文章目录文章目录前言一、是什么?二、题目1.朴素版2.二分版总结 前言 一、是什么? 示例: 二、题目 1.朴素版 题目: AcWing 897. 最长公共子序列 给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。 数据范围: 1≤N≤1000, −10 ^9 ≤ 数列中的数 ≤ 10 ^9 解析: (1) f[N]:所有以第i个数结尾的上升子序列 (2) f[i]=max(f[j]+1),j=0,1,2…i-1 代码: #include<iostream

weixin_47534339的博客 705

求最长公共子序列长度(nlogn)【 包含了求最长上升子序列长度(nlogn)】

这里只说步骤吧,至于原理,可以自己百度找找; 假设两个序列   A,B,找两者的最长公共子序列; 第一步: 我们要去找出 A中所有与 B 相同的元素,这些元素在 B中的位置,各自为一个集合;比如 A = { a c f  d }  ,B = { c f g c a } , 则有  (从 i = 1 开始 )a ={ 5 } , c = { 1 ,4  } , f = { 2 }; a 这个元素...

Y390d的博客 2919

最长上升子序列,最长下降子序列,最长公共子序列

最长上升子序列、最长下降子序列和最长公共子序列是算法中常见的问题。最长上升子序列是指在一个序列中找到最长的子序列,使得子序列中的元素按升序排列。最长下降子序列则是找到最长的子序列,使得子序列中的元素按降序排列。最长公共子序列是在两个序列中找到最长的公共子序列,可以不要求子序列在原序列中连续。

qq_54779611的博客 233

最长公共子序列、最长上升子序列、最长公共上升子序列

1.最长公共子序列: 核心代码: for(int i=1;i&lt;n;i++) { for(int j=1;j&lt;m;j++) { if(a[i]==b[j]) { dp[i][j]=dp[i-1][j-1]+1; } e...

qq_35160381的博客 2834

Ubuntu登录界面黑屏?手把手教你排查和修复LightDM启动失败(附debug命令详解)

本文详细介绍了Ubuntu系统中LightDM(Light Display Manager)启动失败导致登录界面黑屏的排查与修复方法。通过系统状态检查、调试模式分析、常见故障解决方案及高级调试技巧,帮助用户快速定位并解决LightDM相关问题,恢复正常的图形登录环境。

weixin_34005090的博客 314

动态规划之最长上升子序列,最长公共子序列,LIS,LCS模板(java)

动态规划之最长上升子序列,最长公共子序列,LIS,LCS;蓝桥杯;蓝桥杯备赛;动态规划;最长公共序列;最长子序列;算法;java;算法模板;

weixin_72499901的博客 612

概述DeepLab系列(deeplab v1, deeplab v2, deeplab v3, deeplab v3+)

前言:图像分割是指像素级别的图像识别,即标注出图像中每个像素所属的对象类别。 语义分割更注重类别之间的区分,而实例分割更注重个体之间的区别。 DeepLab是由Google团队提出的一系列图像分割算法。 DeepLab v1 (2014年) Paper (ICLR 2015) Code 创新点: 空洞卷积(Atrous Conv); <解决编码过程中信号不断被下采样,细节丢失的问题> 全连接条件随机场(Fully-connected Conditional Random Field)。

ZSH12345678900的博客 5528

最长公共子序列(离散化转化为最长上升子序列)

给出1,2,…,n的两个排列P1​和P2​,求它们的最长公共子序列。

huhubbdd的博客 582

SPSS操作(五):主成分分析

1、将数据导入spss,并定义变量,将铁路运输业职工人数(人)、城市公共交通业职工人数(人)、邮政业职工人数(人)、电信和其他信息传输服务业职工人数(人)、客运量(万人)、接待入境旅游人数(万人次)、普通高校师生比(%)、星级住宿业营业额(亿元)分别定义为x1,x2,x3,x4,x5,x6,x7,x8 如图: 2、对数据进行标准化处理 ①选择【分析】—【描述统计】—【描述】 ②添加要标准化的变量,勾选【将标准化值另存为变量(Z)】,再点确定 ③返回原来的数据窗口就可以看见标准化后的变量了 3、SPS

My_daily_life的博客 8万+

Android System Slice应用加载分析,及启用Slice后,锁屏日期第一次开机正常显示,但后面锁屏不显示问题分析

最近发现Android P上锁屏界面,日期不显示,发现从P开始后,出现了Slice来允许应用以模块化,可交互的方式,插入多个使用场景。Android P的system UI 也使用到了这一特性,表现为锁屏时间,日期,勿扰图标,闹钟等。 如何使用Slice 以System UI中KeyguardSliceView.java来说明它的使用方法 首先,我们打开System UI 的mk 文件,可以看到以...

qq_33595823的博客 3034

【LeetCode 300】最长上升子序列 , 1143.最长公共子序列

【LeetCode 300】最长上升子序列 1. 题目描述 原题: 【LeetCode 300】. 2. 解题思路 动态规划的思想核心类似于数学归纳法。 即通过n-1,n-2来推导n 常见的具体做法是,建立一个dp-table,即一个一维dp数组或者二维dp数组,将递归转化为递推,把大问题分解成子问题,而后通过边界值,再从最小的子问题开始,将dp表依次填满。最终答案就在dp表中。 2.1找子问题...

weixin_41888257的博客 716

ADB详细(从下载安装到灵活运用)

ADB(Android Debug Bridge)是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。可以在Android SDK/platform-tools中找到 adb 工具或下载ADB Kits。

LiuYong_01的博客 10万+

动态规划:最长上升子序列、最长公共子序列

一、基本概念 在介绍最长公共公共子序列之前,先说一下这里的基本概念。 1.串和序列:   串:串是一个连续的部分。比如在12345这个数列中,123这个是一个串,45也是一个串。而135不是一个串。   序列:子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列。还是12345这个数列,135是一个序列,24也是一个序列,当然123也是一个序列。   异同:串...

dengguan2720的博客 243

HWSD中国土壤数据库

T_PH_H2O: Real (酸碱度) T_CEC_CLAY: Real (粘性层土壤的阳离子交换能力);T_CEC_SOIL: Real (土壤的阳离子交换能力) T_BS: Real (基本饱和度);T_CACO3: Real (碳酸盐或石灰含量) T_CASO4: Real (硫酸盐含量);ADD_PROP: Real (土壤单元中与农业用途有关的特定土壤类型);T_USDA_TEX: Real (USDA土壤质地分类);T_REF_BULK: Real (土壤容重);

地球资源数据云的官方博客 4651

几率大的Redis面试题(含答案)

本文的面试题如下: Redis 持久化机制 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构 redis的过期策略以及内存淘汰机制【~】 Redis 为什么是单线程的,优点 如何解决redis的并发竞争key问题 Red...

睶 38万+

最长上升子序列、最长公共子序列及其优化

最长上升子序列、最长公共子序列及其优化

w75779的博客 413

FAST-LIVO2 源码精读(十八):实时性优化、漂移排查与工程落地

FAST-LIVO2 的工程价值,不在于某一个孤立的技巧,而在于它把"激光的几何精度、惯性的高频预测、视觉的纹理与色彩"用一套简洁的滤波框架紧紧拧在一起,又在实时性、鲁棒性、可扩展性之间取得了难得的平衡。先用内建计时表定位瓶颈,再按降采样、并行、滑窗、编译优化、双频输出逐项加速;遇到漂移先看现象、循诊断树定位根因、回到对应章节取解法。十八篇至此收束。

PX4-SLAM-PNC 215

最长公共子序列 最长上升子序列 问题

SDUT 最长公共子序列问题 给定两个序列 X={x1,x2,…,xm} 和 Y={y1,y2,…,yn},找出X和Y的最长公共子序列。 Input 输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。 Output 每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。 Sample...

weixin_44040169的博客 350

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

简单DP(最长公共子序列,最长上升子序列)

最长上升子序列(LIS) **无论是最长上升子序列还是最长公共子序列都不要求连续** 最长上升子序列题目描述: 给一组数据:13,7,9,16,38,24,37,18,44,19,21,22,63,15。求这组数的最长上升子序列? 思想: 首先我们日常定义dp[i],表示以第i个数据为结尾的最长上升子序列的长度,我们假设以第j号数据为尾的最长上升子序列的长度为a,如果现在的这个数据i要大于j的话,那么i的最长上升子序列就不需要从最前面算了,就直接是j的最长上升子序列长度+1 最长上升子序列数据个数求解板

m0_46082460的博客 280

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

动态规划(最长上升子序列,最长公共子序列)

最长上升子序列 一个数的序列bi,当b1<b2<…<bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,…,aN),我们可以得到一些上升的子序列(ai1,ai2,…,aiK),这里1≤i1<i2<…<iK≤N。比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。这些子序列中最长的长度是4,比如子序列(1,3,5,8)。 你的任务,就是对于给定的序列,求出最长上升子序列的长度。 【输入】 输入的第一行是序列的

weixin_45102820的博客 779

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: bfs和dfs的特点
下一篇: 多重背包模板
Puppet__
博客等级 码龄9年 319粉丝 328原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值