• CH5101 LICS//hdu5904 LICS


    恭喜我已经正式沦为pj组选手QwQ

    标题两个题其实不一样的。这是ch   这是hdu


    一、CH上的:裸题,求LICS。n<=3000

    经典普及组dp题,题解烂大街了。所以对于这题,只讲细节:

    $1.A_i=B_j时的转移(或者说继承)f[i][j]=f[i-1][j]可有可无。$

    $可以想到两个末尾相等时由A的前i-1个,B不以B_j为结尾的状态转移$

    $LICS长最多少掉一个。$

    $那么这样取到的前面max(f[i-1][k])至少会是f[i-1][j]-1,再加上最后相等的1个$

    $一定不会比f[i-1][j]差。所以这句有无皆可。(当然我自己写是不会想这么多的)$

    $2.前缀max优化,这个不必说了。$ 不方便优化时看能否调换枚举顺序,调换后可不可以优化枚举。

    我好菜啊啊啊 啊啊啊啊啊 啊啊啊啊

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<queue>
     7 #define dbg(x) cerr<<#x<<" = "<<x<<endl
     8 #define ddbg(x,y) cerr<<#x<<" = "<<x<<"   "<<#y<<" = "<<y<<endl
     9 using namespace std;
    10 typedef long long ll;
    11 template<typename T>inline char MIN(T&A,T B){return A>B?A=B,1:0;}
    12 template<typename T>inline char MAX(T&A,T B){return A<B?A=B,1:0;}
    13 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
    14 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
    15 template<typename T>inline T read(T&x){
    16     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c=='-')f=1;
    17     while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x;
    18 }
    19 const int N=3000+7;
    20 int f[N][N],a[N],b[N],m,n,maxv,ans;
    21 
    22 int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
    23     m=read(n);
    24     for(register int i=1;i<=n;++i)scanf("%d",&a[i]);for(register int i=1;i<=n;++i)scanf("%d",&b[i]);
    25     for(register int i=1;i<=n;++i){
    26         maxv=0;
    27         for(register int j=1;j<=m;++j){
    28             if(a[i]==b[j])f[i][j]=maxv+1;
    29             else f[i][j]=f[i-1][j],b[j]<a[i]?MAX(maxv,f[i-1][j]):0;
    30             MAX(ans,f[i][j]);
    31         }
    32     }
    33     return printf("%d
    ",ans),0;
    34 }

    二、hdu上的:跪于英语不好。。

    Original:He wants find a longest common subsequence that consists of consecutive values in increasing order.

    也就是LICS要求是连续上升的(也就是公差是1)

    那这不就简单了么。

    两数组各做一遍dp,求以这个数结尾的最大连续长度。最后比对一下。

    没了。code不放了。

  • 相关阅读:
    字符串,列表和元组-3
    数据和表达式-2
    python3.6.2(32位)的安装-1
    HTTP协议
    bug无法重现
    当开发说不是BUG时怎么办
    Python流程分类初试
    私有,封装
    Python继承
    编译型语言和解释型语言
  • 原文地址:https://www.cnblogs.com/saigyouji-yuyuko/p/10673346.html
Copyright © 2020-2023  润新知