首页 > 其他分享 >LCS(最长公共子序列)

LCS(最长公共子序列)

时间:2023-01-23 21:57:22浏览次数:48  
标签:ch const LCS int 公共 序列 最长 define

P1439 【模板】最长公共子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

A:3 2 1 4 5

B:1 2 3 4 5

 

思路:

 主要考虑离散化,先不离散化成数字,不好理解 A:3 2 1 4 5 → A:a b c d e 离散化之后A是单调递增的 举几个B的例子:× b × d ×   b,d是单调递增的,b,d是A,B的公共子序列之一         a × c d × a,c,d是单调递增的,a,c,d是A,B的公共子序列之一, 题目样例来说 A: a b c d e
B: c b a d e   a,d /a,d,e都是递增的,都是A,B的公共子序列之一 显然这时候我们只用求离散化后,B的最长上升子序列,就是LCS的答案了   Code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pb push_back   //vector函数
#define popb pop_back  //vector函数
#define fi first
#define se second
const int N=1e5+10;
//const int M=;
//const int inf=0x3f3f3f3f;     //一般为int赋最大值,不用于memset中
//const ll INF=0x3ffffffffffff; //一般为ll赋最大值,不用于memset中
int T,n,a[N],b[N],c[N],pos[N],f[N];
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
int main()
{
//    freopen("","r",stdin);
//    freopen("","w",stdout);
    n=read();
    for(int i=1;i<=n;i++) a[i]=read(),pos[a[i]]=i;
    for(int i=1;i<=n;i++) b[i]=read(),c[i]=pos[b[i]]; 将b数组离散化成c数组
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        int l=1,r=ans;
        if(!ans) { ans=1,f[1]=c[1];continue; }
        while(l+1<r)
        {
            int mid=(l+r)/2;
            if(f[mid]<c[i]) l=mid;
            else r=mid;
        }
        int len;
        if(f[r]<c[i]) len=r;
        else if(f[l]<c[i]) len=l;
        else len=0;
        if(!f[len+1]) f[len+1]=c[i];
        else f[len+1]=min(f[len+1],c[i]);
        ans=max(ans,len+1);
    }
    printf("%d\n",ans);
    return 0;
}

 

标签:ch,const,LCS,int,公共,序列,最长,define
From: https://www.cnblogs.com/Willette/p/17065569.html

相关文章

  • LIS最长上升子序列
    一种方法是O(Nˆ2)的DP主要是O(NlogN)的DP最长上升子序列,最长不下降子序列,最长下降子序列,最长不上升子序列都同理 以LIS最长上升子序列为例DP思路:总的来说,我们要求......
  • 2816. 判断子序列
    文章目录​​Question​​​​Ideas​​​​Code​​Question给定一个长度为n的整数序列a1,a2,…,an以及一个长度为m的整数序列b1,b2,…,bm。请你判断a序列是否为......
  • Java反序列化-CommonsCollections2利用链分析
    前言接上篇TemplatesImpl利用链分析,学习了通过TemplatesImpl利用链来进行类加载执行恶意代码,现在来学习一下CommonsCollections2利用链。分析前的准备漏洞组件:commons-c......
  • LeetCode最长回文子串(/dp)
    原题解题目约束解法解法一#include<iostream>#include<string>#include<vector>usingnamespacestd;classSolution{public:stringlongestPa......
  • 【双指针】LeetCode 409. 最长回文串
    题目链接409.最长回文串思路遍历字符串过程中统计字符出现个数,如果达到2则说明可以放到回文串的两端,需要result+=2。遍历完之后的回文串如果长度小于s,说明s中存......
  • 序列凑零(冬季每日一题 35)
    给定一个长度为的整数序列。所有都是非零整数并且绝对值不超过。另外,现在,请你构造另一个整数序列,使得要求,所有都是非零整数并且绝对值不超过。输入格式第一行包......
  • 8种时间序列分类方法总结
    对时间序列进行分类是应用机器和深度学习模型的常见任务之一。本篇文章将涵盖8种类型的时间序列分类方法。这包括从简单的基于距离或间隔的方法到使用深度神经网络的方法......
  • PIPOJ 最大连续子序列
    题目描述给定 K 个整数的序列{ N1, N2, ..., NK} ,其任意连续子序列可表示为{ Ni, Ni+1,...,Nj} ,其中1<=i<=j <=K。最大连续子序列是所有连续子序列......
  • Change Usernames(拓扑序列)
    题目链接题目描述:Yourunawebservicewith\(N\)users.The\(i\)-thuserwithacurrenthandle\(S_i\)wantstochangeitto\(T_i\).Here,\(S_1,…,\)and......
  • Rust Serde 反序列化的概念
    这几天在捣鼓Serde::Deserializer,发现有一点难理解。死磕了7、8小时后,算是明白了它的原理。如果你也想自己捣鼓,你可以试著把下列两个网址所有代码(代码是以1个简单json反序列......