1425: LCS与LIS
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 55 Solved: 25
Submit Status Web Board
Description
LCS(最长公共子序列)是单身,LIS(最长上升子序列)也是单身,于是他们在一起了,变成了LCIS(最长公共上升子序列)o(╯□╰)o。你的任务是求给定两个序列的LCIS的长度,此处上升指的是严格单调递增。
Input
第一行一个正整数T(T <= 50),表示有T组数据。
每组数据输入格式如下:
第一行为俩个正整数N,M(N,M<=50),表示俩个序列长度。
第二行N个正整数,表示第一个序列。
第三行M个正整数,表示第二个序列。
所有序列中的元素均<=200。
Output
共输出T行,即每组数据的LCIS的长度。
Sample Input
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
Sample Output
34
HINT
样例解释
第一组数据的LCIS为<1,2,5>或<1,2,4>或<1,3,5>或<1,3,4>,所以答案为3。
第二组数据的LCIS为<1,2,3,13>或<1,2,3,5>,所以答案为4。
Source
#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;
}