• 【luogu1439】 【模板】最长公共子序列 [动态规划][LIS最长上升子序列][离散化]


    P1439 【模板】最长公共子序列

     此思路详见luogu第一个题解 一个很妙的离散化

    刘汝佳蓝书上面的LIS 详见蓝书

    d[i]以i为结尾的最长上升子序列的长度     g[i]表示d值为i的最小状态的编号即长度为i的上升子序列的最小末尾值(d[j]=i的j值最小)

     liurujia's

    for(int i=1;i<=n;++i) g[i]=inf;
    for(int i=1;i<=n;++i){
        int k=lower_buond(g+1,g+1+n,a[i])-g;
        d[i]=k;
        g[k]=a[i];
    }

    只是手写二分的时候巨难受

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define rg register
     4 const int N=100000+5,inf=0x3f3f3f3f;
     5 int n,a[N],b[N],ca[N],cb[N];
     6 int g[N],d[N],len=0;
     7 
     8 template<class t>void rd(t &x)
     9 {
    10     x=0;int w=0;char ch=0;
    11     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    12     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    13     x=w?-x:x;
    14 }
    15 
    16 int main()
    17 {
    18     rd(n);
    19     memset(g,inf,sizeof(g));
    20     for(rg int i=1;i<=n;++i) rd(a[i]),ca[a[i]]=i;
    21     for(rg int i=1;i<=n;++i) rd(b[i]),cb[i]=ca[b[i]];
    22     for(rg int i=1;i<=n;++i)
    23     {
    24         int k=lower_bound(g+1,g+1+n,cb[i])-g;
    25         g[k]=cb[i];
    26         len=max(len,k);
    27     }
    28     printf("%d",len);
    29     return 0; 
    30 } 
    100昏 用lower_bound
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define rg register
     4 const int N=100000+5,inf=0x3f3f3f3f;
     5 int n,a[N],b[N],ca[N],cb[N];
     6 int g[N],len=0;
     7 
     8 template<class t>void rd(t &x)
     9 {
    10     x=0;int w=0;char ch=0;
    11     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    12     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    13     x=w?-x:x;
    14 }
    15 
    16 int find(int x)
    17 {
    18     int l=1,r=len,mid;
    19     while(l<=r)
    20     {
    21         mid=(l+r)>>1;
    22         if(x>g[mid]) l=mid+1;
    23         else r=mid-1;
    24     }
    25     return l;
    26 }
    27 
    28 int main()
    29 {
    30     rd(n);
    31     memset(g,inf,sizeof(g));
    32     for(rg int i=1;i<=n;++i) rd(a[i]),ca[a[i]]=i;
    33     for(rg int i=1;i<=n;++i) rd(b[i]),cb[i]=ca[b[i]];
    34     for(rg int i=1;i<=n;++i)
    35     {
    36         int k=find(cb[i]);
    37         g[k]=cb[i];
    38         len=max(len,k);
    39     }
    40     printf("%d",len);
    41     return 0; 
    42 } 
    100昏 手写二分
  • 相关阅读:
    <form:select>的使用
    存储过程-删除、新建索引
    java 反射常用总结
    java判断是否是数字
    jquery遍历数组添加行删除行
    oracle常用sql
    cxf (zhuan)
    linux 常用命令--个人小结一
    java发送邮件
    socket和webservice特点
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/10804386.html
Copyright © 2020-2023  润新知