Greatest Common Increasing Subsequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3603 Accepted Submission(s): 1136
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题意:求两个序列的最长公共上升子序列AC代码:#include <iostream> #include <cmath> #include <cstdlib> #include <cstring> #include <cstdio> #include <queue> #include <ctime> #include <vector> #include <algorithm> #define ll long long #define L(rt) (rt<<1) #define R(rt) (rt<<1|1) using namespace std; const int INF = 1e9; const int maxn = 505; int dp[maxn], a[maxn], b[maxn]; int n, m; int main() { int t; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); scanf("%d", &m); for(int i = 1; i <= m; i++) scanf("%d", &b[i]); memset(dp, 0, sizeof(dp)); for(int i = 1; i <= n; i++) { int Max = 0; for(int j = 1; j <= m; j++) { if(a[i] > b[j] && Max < dp[j]) Max = dp[j]; else if(a[i] == b[j]) dp[j] = Max + 1; } } int ans = 0; for(int i = 1; i <= m; i++) if(dp[i] > ans) ans = dp[i]; printf("%d\n", ans); if(t) puts(""); } return 0; }