hdu_5904_LCIS(DP)

题目链接:hdu_5904_LCIS

题意:

给你两串数,让你找这两串数的最长公共子序列,并且这个最长公共子序列是连续的数值

题解:

我们首先先分别处理出a,b的每个数的最长连续的长度

然后随便找一串数来更新一下答案就行了

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define F(i,a,b) for(int i=a;i<=b;i++)
 5 using namespace std;
 6 
 7 inline void up(int &a,int b){if(a<b)a=b;}
 8 
 9 const int N=1e5+7;
10 int a[N],b[N],T,n,m,f[N],aa[N],bb[N];
11 
12 int LCIS()
13 {
14     int ans=0;
15     memset(aa,0,sizeof(aa));
16     memset(bb,0,sizeof(bb));
17     F(i,1,n)up(aa[a[i]],aa[a[i]-1]+1);
18     F(i,1,m)up(bb[b[i]],bb[b[i]-1]+1);
19     if(n>m)F(i,1,m)up(ans,min(aa[b[i]],bb[b[i]]));
20     else F(i,1,n)up(ans,min(aa[a[i]],bb[a[i]]));
21     return ans;
22 }
23 
24 int main()
25 {
26     scanf("%d",&T);
27     while(T--)
28     {
29         scanf("%d%d",&n,&m);
30         F(i,1,n)scanf("%d",a+i);
31         F(i,1,m)scanf("%d",b+i);
32         printf("%d
",LCIS());
33     }
34     return 0;
35 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/5904338.html