hdu 1423 Greatest Common Increasing Subsequence(LCIS)

来源:互联网 发布:单片机项目承接 编辑:程序博客网 时间:2024/05/22 12:28

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
151 4 2 5 -124-12 1 2 4
 

Sample Output
2
 
题意:求两个序列的最长公共上升子序列
思路:O(nm)算法http://wenku.baidu.com/link?url=jRAsIbn0CTZwUhOpO7OchngHnPAhvKgd67Wg-mXyZu-j-LLKqdaKM0REpNZYRN2W1olo2Xnsui2EaQaQEkzylX-ORf0RXuv6L7DnfnZYSie
 
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;}

0 0