Greatest Common Increasing Subsequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6073 Accepted Submission(s): 1976
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
题目大意:求出两个数组公共的最长的上升子序列(可以不是连续的子序列)。
这是一道典型的求最长公共子序列问题。
本题dp数组值的变化情况:#include <stdio.h> #include <string.h> #define MAX 501 int T; int seq1[MAX], seq2[MAX]; int len1, len2; int dp[MAX]; int LCIS(){ int i, j; int Max; memset(dp, 0, sizeof(dp)); //关键部分 for (i = 1; i <= len1; ++i){ Max = 0; for (j = 1; j <= len2; ++j){ if (seq1[i] > seq2[j] && Max < dp[j]) Max = dp[j]; if (seq1[i] == seq2[j]) dp[j] = Max + 1; } /*观察该数组值的变化 for (int I = 1; I <= len2; ++I) printf("%d ",dp[I]); printf("\n"); */ } Max = 0; for (i = 1; i <= len2; ++i){ if (Max < dp[i]) Max = dp[i]; } return Max; } int main(){ int i; scanf("%d", &T); while (T-- != 0){ scanf("%d", &len1); for (i = 1; i <= len1; ++i) scanf("%d", &seq1[i]); scanf("%d", &len2); for (i = 1; i <= len2; ++i) scanf("%d", &seq2[i]); printf("%d\n", LCIS()); if (T) putchar('\n'); } return 0; }