首页 > 代码库 > hdu_5904_LCIS(DP)

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\n",LCIS());33     }34     return 0;35 }
View Code

 

hdu_5904_LCIS(DP)