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>
int t,l1,l2,k;
int s1[510], s2[510];
int dp[510];
int song()
{
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= l1; ++i)
{
k = 0;
for (int j = 1; j <= l2; ++j)
{
if (s1[i] > s2[j] && k < dp[j])
k = dp[j];
if (s1[i] == s2[j])
dp[j] = k+ 1;
}
}
k = 0;
for (int i = 1; i <= l2; ++i)
{
if (k < dp[i])
k = dp[i];
}
return k;
}
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &l1);
for (int i = 1; i <= l1; ++i)
scanf("%d", &s1[i]);
scanf("%d", &l2);
for (int i = 1; i <= l2; ++i)
scanf("%d", &s2[i]);
printf("%d\n", song());
if (t)
putchar('\n');
}
return 0;
}