标签:
LCS(最长公共子序列)是单身,LIS(最长上升子序列)也是单身,于是他们在一起了,变成了LCIS(最长公共上升子序列)o(╯□╰)o。你的任务是求给定两个序列的LCIS的长度,此处上升指的是严格单调递增。
第一行一个正整数T(T <= 50),表示有T组数据。
每组数据输入格式如下:
第一行为俩个正整数N,M(N,M<=50),表示俩个序列长度。
第二行N个正整数,表示第一个序列。
第三行M个正整数,表示第二个序列。
所有序列中的元素均<=200。
共输出T行,即每组数据的LCIS的长度。
25 51 3 2 5 41 2 3 5 49 118 1 2 7 6 3 4 13 54 1 2 9 10 3 8 7 13 5 6
34
样例解释
第一组数据的LCIS为<1,2,5>或<1,2,4>或<1,3,5>或<1,3,4>,所以答案为3。
第二组数据的LCIS为<1,2,3,13>或<1,2,3,5>,所以答案为4。
#include<iostream> #include<string.h> using namespace std; int main() { int T,N,M,a[51],b[51],i,j,dp[51][51],k; cin>>T; while(T--) { memset(dp,0,sizeof(dp)); cin>>N>>M; for(i=0;i<N;i++) cin>>a[i]; for(i=0;i<M;i++) cin>>b[i]; for(i=1;i<=N;i++) { k=0; for(j=1;j<=M;j++) { if(a[i-1]!=b[j-1]) dp[i][j]=dp[i-1][j]; if(a[i-1]>b[j-1] && dp[i][j]>dp[i][k]) k=j; if(a[i-1]==b[j-1]) { dp[i][j]=dp[i][k]+1; } } } int ans=-1;int x=N; for(i=1;i<=M;i++) { if(dp[N][i]>ans) { ans=dp[N][i]; } } cout<<ans<<endl; } return 0; }
标签:
原文地址:http://blog.csdn.net/zuguodexiaoguoabc/article/details/45156081