hdu 1423 Greatest Common Increase Subsequence(最長上昇共通サブシーケンス)

1585 ワード

http://acm.hdu.edu.cn/showproblem.php?pid=1423
はい、この問題に対しては言葉がないという意味です.
二つの数字の系列をあげて、一番長いのは公共のサブシーケンスの長さを上げることを求めます.したがって、最初の共通サブシーケンスは、最初のシーケンスiが対応するまでの最長の共通サブシーケンスの長さを配列でマークし、最長の上昇サブシーケンスを求めることができます.
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int main()
{
    int test;
    int n,m;
    int a[510],b[510],c[510],d[510];
    int dp[510][510];
    scanf("%d",&test);
    for(int item = 1; item <= test; item++)
    {
        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++)
        {
        	c[i] = -1;//c[i]   i            
            for(int j = 1; j <= m; j++)
            {
				if(a[i] == b[j])
					dp[i][j] = dp[i-1][j-1]+1;
				else
					dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
				c[i] = max(c[i],dp[i][j]);
            }
        }

        int maxn = -1,pos = 1;
        for(int i = 1; i <= n; i++)
        {
        	d[i] = 1;//d[i]   i            
        	for(int j = 1; j < i; j++)
			{
				if(a[j] < a[i] && d[i] < d[j]+1)
					d[i] = d[j]+1;
			}
			if(maxn < d[i])
			{
				maxn = d[i];
				pos = i;
			}
        }
        //                         
        printf("%d
",c[pos]); if(item < test) printf("
");// , PE. } return 0; }