Greatest Common Increasing Subsequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6492 Accepted Submission(s): 2112
Problem Description
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<iostream>
#include<queue>
#include<map>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
using namespace std;
int num1[600];
int num2[600];
int dp[600];
int main()
{
int text;
cin>>text;
while(text--)
{
int n1,n2;
cin>>n1;
for(int i = 1 ; i <= n1 ; ++i)
cin>>num1[i];
cin>>n2;
for(int i = 1 ; i <= n2 ; ++i)
cin>>num2[i];
dp[0] = 0;
int now = 0;
memset(dp , 0 , sizeof(dp));
for(int i = 1 ; i <= n1 ; ++i)
{
now = 0;
for(int j = 1 ; j <= n2 ; ++j)
{
if(num1[i] == num2[j])
{
dp[j] = max(dp[j] ,dp[now] + 1);
}
if(num1[i] > num2[j])
{
if(dp[j] > dp[now])
{
now = j;
}
}
}
}
int maxlen = 0;
for(int i = 1 ; i <= n2 ; ++i)
{
maxlen = max(maxlen , dp[i]);
}
cout<<maxlen<<endl;
if(text)cout<<endl;
}
return 0;
}