Greatest Common Increasing Subsequence
原题链接 http://acm.hdu.edu.cn/showproblem.php?pid=1423
This is a problem from ZOJ 2432.To make it easyer,you just need output the length of the subsequence.
Input
Each sequence is described with M - its length (1 <= M <= 500) and M integer numbers Ai (-2^31 <= Ai < 2^31) - the sequence itself.
Output
output print L - the length of the greatest common increasing subsequence of both sequences.
Sample Input
1
5
1 4 2 5 -12
4
-12 1 2 4
Sample Output
2
如果两个元素相等,就去找他前方最大的公共子序列,必须考虑到最长子串的公共性,并且满足上升关系。
以下是AC代码
#include<stdio.h>
#include<string.h>
int l1,l2;
int a1[1000],a2[1000],dp[1000];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof dp);
scanf("%d",&l1);
for(int i=1; i<=l1; i++)
{
scanf("%d",&a1[i]);
}
scanf("%d", &l2);
for(int i=1; i<=l2; i++)
{
scanf("%d", &a2[i]);
}
int Max;
for(int i=1; i<=l1; i++)
{
Max=0;
for(int j=1; j<=l2; ++j)
{
if(a1[i]>a2[j]&&Max<dp[j])
{
Max=dp[j];
}
if(a1[i]==a2[j])
{
dp[j]=Max+1;
}
}
}
Max=0;
for(int i=1; i<=l2; i++)
{
if(Max<dp[i])
{
Max=dp[i];
}
}
printf("%d\n",Max);
if(t)
printf("\n");
}
return 0;
}