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
题意:求最大公共上升子序列的长度。
思路:二维数组dp内存的是最长上升子序列的长度,dp[i][j],表示数组a的前i项,数组b的前j项的最长公共上升子序列,在一层for循环内每次满足条件就更新maxx的值,在外层for循环更新sum的值,最后输出即可,代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
long long dp[550][550],a[550],b[550];
int main()
{
long long i,j,T,n1,n2,sum,maxx;
scanf("%lld",&T);
while(T--)
{
sum=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(dp,0,sizeof(dp));
scanf("%lld",&n1);
for(i=1; i<=n1; i++)
scanf("%lld",&a[i]);
scanf("%lld",&n2);
for(i=1; i<=n2; i++)
scanf("%lld",&b[i]);
for(i=1; i<=n1; i++)
{
maxx=0;
for(j=1; j<=n2; j++)
{
dp[i][j]=dp[i-1][j];
if(b[j]<a[i]&&maxx<dp[i-1][j])
maxx=dp[i-1][j];
if(a[i]==b[j])
dp[i][j]=++maxx;
}
if(sum<maxx)
sum=maxx;
}
printf("%lld\n",sum);
if(T)
printf("\n");
}
return 0;
}