zoukankan      html  css  js  c++  java
  • [AHOI2006]基因匹配

    https://www.zybuluo.com/ysner/note/1332445

    题面

    给出两个数列,它们都包含(n)种元素,并且每种元素都恰有(5)个,求它们的最长公共子序列。

    • (nleq20000)

    解析

    一般的(LCS)求法是(O(n^2))的。
    (f[i][j])表示在(s1)中匹配到第(i)个,(s2)中匹配到第(j)个。

    fp(i,1,n)
        fp(j,1,n)
        {
          f[i][j]=max(f[i][j-1],f[i-1][j]);
          if(a[i]==b[j]) f[i][j]=max(f[i][j],f[i-1][j-1]+1);
        }
    

    但是(LCS)有时可以转化为(LIS)来做。
    假设有两个序列
    (s1[6]={a,b,c,a,d,c},s2[7]={c,a,b,e,d,a,b})
    记录(s1)中每个元素在(s2)中出现的位置, 再将位置按降序排列, 则上面的例子可表示为:
    (loc(a)={6,2},loc(b)={7,3},loc(c)={1},loc(d)={5})
    (s1)中每个元素的位置按(s1)中元素的顺序排列成一个序列
    (s3={6,2,7,3,1,6,2,5,1})
    再对(s3)(LIS)得到的值即为求(LCS)的答案。

    感觉这有点像一种等效替代,倒序实际上保证了不能自己向自己转移。

    这题转化为(LIS)问题后序列长度为(5*10^5),用(O(nlogn))(LCS)算法可以解决。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define ll long long
    #define re register
    #define il inline
    #define fp(i,a,b) for(re int i=a;i<=b;++i)
    #define fq(i,a,b) for(re int i=a;i>=b;--i)
    using namespace std;
    const int N=5e5+100;
    int n,m,pre[N][6],f[N],sta[N],t[N],top,ans;
    il ll gi()
    {
      re ll x=0,t=1;
      re char ch=getchar();
      while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
      if(ch=='-') t=-1,ch=getchar();
      while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
      return x*t;
    }
    il int max(re int x,re int y){return x>y?x:y;}
    il void upd(re int x,re int w){for(;x<=n;x+=x&-x) t[x]=max(t[x],w);}
    il int que(re int x){re int res=0;for(;x;x-=x&-x) res=max(res,t[x]);return res;}
    int main()
    {
      m=gi();n=m*5;
      fp(i,1,n)
        {
          re int x=gi();
          pre[x][++pre[x][0]]=i;
        }
      fp(i,1,n)
        {
          re int x=gi();
          fq(j,5,1) sta[++top]=pre[x][j];
        }
      fp(i,1,top)
        f[i]=que(sta[i]-1)+1,upd(sta[i],f[i]),ans=max(ans,f[i]);
      printf("%d
    ",ans);
      return 0;
    }
    
  • 相关阅读:
    383. Ransom Note
    598. Range Addition II
    453. Minimum Moves to Equal Array Elements
    492. Construct the Rectangle
    171. Excel Sheet Column Number
    697. Degree of an Array
    665. Nondecreasing Array
    视频网站使用H265编码能提高视频清晰度吗?
    现阶段的语音视频通话SDK需要解决哪些问题?
    企业远程高清会议平台视频会议系统在手机端使用的必备要求有哪些?
  • 原文地址:https://www.cnblogs.com/yanshannan/p/9906285.html
Copyright © 2011-2022 走看看