zoukankan      html  css  js  c++  java
  • HDU1423:Greatest Common Increasing Subsequence(LICS)

    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
     


     

    题意:求最长递增公共子序列的长度

    思路:直接模板

    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    
    int n,m,a[505],b[505],dp[505][505];
    
    int LICS()
    {
        int MAX,i,j;
        memset(dp,0,sizeof(dp));
        for(i = 1; i<=n; i++)
        {
            MAX = 0;
            for(j = 1; j<=m; j++)
            {
                dp[i][j] = dp[i-1][j];
                if(a[i]>b[j] && MAX<dp[i-1][j])
                    MAX = dp[i-1][j];
                if(a[i]==b[j])
                    dp[i][j] = MAX+1;
            }
        }
        MAX = 0;
        for(i = 1; i<=m; i++)
            if(MAX<dp[n][i])
                MAX = dp[n][i];
        return MAX;
    }
    
    int main()
    {
        int i,t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            for(i = 1; i<=n; i++)
                scanf("%d",&a[i]);
                scanf("%d",&m);
            for(i = 1; i<=m; i++)
                scanf("%d",&b[i]);
            printf("%d
    ",LICS());
            if(t)
            printf("
    ");
        }
    
        return 0;
    }
    


     

    上面的虽然可以解决,但是二维浪费空间较大,我们注意到在LICS函数中有一句dp[i][j] = dp[i-1][j],这证明dp数组前后没有变化!于是可以优化成一维数组!

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    
    int a[505],b[505],dp[505],n,m;
    
    int LICS()
    {
        int i,j,MAX;
        memset(dp,0,sizeof(dp));
        for(i = 1; i<=n; i++)
        {
            MAX = 0;
            for(j = 1; j<=m; j++)
            {
                if(a[i]>b[j] && MAX<dp[j])
                    MAX = dp[j];
                if(a[i]==b[j])
                    dp[j] = MAX+1;
            }
        }
        MAX = 0;
        for(i = 1; i<=m; i++)
            if(MAX<dp[i])
                MAX = dp[i];
        return MAX;
    }
    
    int main()
    {
        int t,i;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            for(i = 1; i<=n; i++)
                scanf("%d",&a[i]);
            scanf("%d",&m);
            for(i = 1; i<=m; i++)
                scanf("%d",&b[i]);
            printf("%d
    ",LICS());
            if(t)
                printf("
    ");
        }
    
        return 0;
    }
    


     

  • 相关阅读:
    scrapy中selenium的应用
    Django的锁和事务
    redis
    【leetcode】187. Repeated DNA Sequences
    【leetcode】688. Knight Probability in Chessboard
    【leetcode】576. Out of Boundary Paths
    【leetcode】947. Most Stones Removed with Same Row or Column
    【leetcode】948. Bag of Tokens
    【leetcode】946. Validate Stack Sequences
    【leetcode】945. Minimum Increment to Make Array Unique
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3225983.html
Copyright © 2011-2022 走看看