Greatest Common Increasing Subsequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7433 Accepted Submission(s): 2391
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
Source
思路:最长递增公共子序列的模板题目
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int a[505],b[505],dp[505],n,m,t;
int LICS(){
int MAX;
for(int i = 1; i <= n; i ++){
MAX = 0;
for(int j = 1; j <= m; j ++){
if(a[i-1] > b[j-1] && MAX < dp[j])
MAX = dp[j];
if(a[i-1] == b[j - 1])
dp[j] = MAX + 1;
}
}
MAX = 0;
for(int i = 1; i <= m; i ++)
MAX = max(dp[i],MAX);
return MAX;
}
int main(){
scanf("%d",&t);
while(t --){
scanf("%d",&n);
for(int i = 0; i < n; i ++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int j = 0; j < m; j ++)
scanf("%d",&b[j]);
memset(dp,0,sizeof(dp));
printf("%d\n",LICS());
if(t)
printf("\n");
}
return 0;
}