hdu1423 最长公共上升子序列

题目传送门

Greatest Common Increasing Subsequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10279    Accepted Submission(s): 3311


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
 

 

Recommend
lcy   |   We have carefully selected several similar problems for you:  1422 1421 1400 1418 1424 
题意:求两个序列的最长公共上升子序列
题解:定义dp[j]表示a序列中从1到n与b序列中从1到j并以b[j]为结尾的最长公共上升子序列的长度。
状态转移方程:dp[j] = dp[k] + 1, if(a[i] = = b[j]), 1 <= k < j.
代码:
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<queue>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> PII;
#define mod 1000000007
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
//head
#define MAX 505
int T;
int n,m;
int a[MAX],b[MAX];
int dp[MAX];
void LCIS()
{
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++)
    {
       int pos=1;
        for(int j=1;j<=m;j++){
            if(a[i]>b[j]&&dp[j]+1>dp[pos]) pos=j;
            if(a[i]==b[j]) dp[j]=dp[pos]+1;
        }
    }
}
void solve()
{
    LCIS();
    int maxn=0;
    for(int i=1;i<=m;i++)
    {
        maxn=max(maxn,dp[i]);
    }
    printf("%d\n",maxn);
}
int main()
{
    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]);
        solve();
    }
    return 0;
}

 

 
posted @ 2018-11-01 17:50  better46  阅读(194)  评论(0编辑  收藏  举报