hdu 1423 Greatest Common Increasing Subsequence 题解

#include <stdio.h>

#include <string.h>

#include <math.h>

#include <algorithm>

#include <queue>

using namespace std;

int  dp[550];

int T;

int a[550],b[550];

int main()

{

    scanf("%d",&T);

    int m,n;

    while(T--)

    {

        scanf("%d",&m);

        for(int i=1; i<=m; i++)

            scanf("%d",&a[i]);

        scanf("%d",&n);

        for(int j=1; j<=n; j++)

            scanf("%d",&b[j]);

        memset(dp,0,sizeof(dp));

        dp[0]=-1;

 

        for(int i=1;i<=m;i++)

        {

           int  locate =0;

            for(int j=1;j<=n;j++)

            {

                if(a[i]>b[j]&&dp[j]>dp[locate])  locate = j;//在 b数组中找比a[i]小并且dp值最大的地方

                if(a[i]==b[j])

                {

                    if(locate==0)//如果在前j-1项没有找到比a[i]小的

                        dp[j]=1; //那么j的dp值就只能等于1

                    else dp[j] = dp[locate] +1;//否则就以比a[i]小的前面的数里dp值最大的数+1

                }

            }

        }

 

        int ans = -1;

        for(int i =1;i<=n;i++)

        {

            if(ans<dp[i])

                ans =dp[i];

        }

        printf("%d\n",ans);

        if(T) printf("\n");

    }

    return 0;

}

 

你可能感兴趣的:(sequence)