您的位置:首页 > 其它

LCS与LIS

2015-04-20 21:39 253 查看

1425: LCS与LIS

Time Limit: 1 Sec Memory Limit: 128 MB

Submit: 55 Solved: 25

SubmitStatusWeb 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
[i]>ans)
{
ans=dp
[i];
}
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: