zoukankan      html  css  js  c++  java
  • 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
    ",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;
    }
     
  • 相关阅读:
    如何写一个使用Web Service的IOS应用
    iPad定制相机界面
    IOS Quartz 2D 学习(1)
    cocoa Shallow Copy与Deep Copy
    sqlite3_prepare_v2返回1
    IOS 监听相机对焦事件
    UIImageView添加响应事件无响应
    二、Mongodb常用命令
    三、Mongodb Java中的使用
    多测师肖老师__第二个月python安装和pycharm安装
  • 原文地址:https://www.cnblogs.com/zhgyki/p/9890726.html
Copyright © 2011-2022 走看看