Greatest Common Increasing Subsequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11284 Accepted Submission(s): 3638
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
ACM暑期集训队练习赛(二)
问题链接:HDU1423 Greatest Common Increasing Subsequence
问题简述:(略)
问题分析:
这是一个LCIS(最长公共子上升序列)的模板题。只需要求出序列长度,而不需要求出那个序列。
程序说明:(略)
参考链接:(略)
题记:(略)
AC的C++语言程序如下:
/* HDU1423 Greatest Common Increasing Subsequence */
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 500;
int a[N + 1], b[N + 1], dp[N + 1];
int lcis(int n, int m)
{
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
int k = 1;
for (int j = 1; j <= m; j++) {
if (a[i] == b[j])
dp[j] = max(dp[j], dp[k] + 1);
else if(a[i] > b[j]) {
if(dp[k] < dp[j])
k = j;
}
}
}
int ans = 0;
for (int i = 1; i <= m; i++)
ans = max(ans, dp[i]);
return ans;
}
int main(void)
{
int t, n, m;
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]);
printf("%d\n", lcis(n, m));
if (t) printf("\n");
}
return 0;
}