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
题目大意:给出两个序列,求两个序列的最长公共上升子序列。
思路:根据最长上升子序列,和最长公共子序列的模板,当满足上升和相等的时候即为所求的。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[510],b[510];
int m,n;
int dp[510];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(dp,0,sizeof(dp));
scanf("%d",&m);
for(int i=0; i<m; i++)
scanf("%d",&a[i]);
scanf("%d",&n);
for(int j=0; j<n; j++)
scanf("%d",&b[j]);
int ans=-1;
for(int i=0; i<m; i++)
{
int maxx=0;
for(int j=0; j<n; j++)
{
if(a[i]>b[j]&&dp[j]>maxx)//当满足上升的时候更新
maxx=dp[j];
if(a[i]==b[j])
dp[j]=maxx+1;//当两个数字相等的时候才能加1
ans=max(ans,dp[j]);
}
}
printf("%d\n",ans);
if(t)
printf("\n");
}
return 0;
}