现在的位置: 首页 > 综合 > 正文

hdu 4512 吉哥系列故事——完美队形I(最长上升公共子串)

2018年11月09日 ⁄ 综合 ⁄ 共 706字 ⁄ 字号 评论关闭

求最长上升公共子串

f【i】【j】表示a(1,i),b(1,j)取以b【j】结尾的最大公共上升子串的大小

当a【i】 != b【j】 时,f【i】【j】 = f【i - 1】【j】

否则:f【i】【j】 = max { f【i - 1】【(1……j - 1)】 && (a[i] > b[1……j - 1])};

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 205
int a[MAXN];
int f[MAXN][MAXN];

int main()
{
    int T, N;
    for(scanf("%d", &T); T--; )
    {
        scanf("%d", &N);
        for(int i = 1; i <= N; ++i)
            scanf("%d", &a[i]);
        memset(f, 0, sizeof(f));
        int ans = 1;
        for(int i = 1; i <= N; ++i)
        {
            int max = 0;
            for(int j = N; i < j;  --j)
            {
                f[i][j] = f[i-1][j];//假设不相等

                if((a[i] == a[j]) && (f[i][j] < max + 1))//当相等
                    f[i][j] = max + 1;

                else if((a[i] > a[j]) &&(f[i-1][j] > max)) max = f[i-1][j];//在b串中,取一个以小于a【i】的结尾的最大长度
                if(f[i][j] * 2 > ans) ans = f[i][j] * 2;
                for(int k = i + 1; k < j; ++k)//判断是否中间有一个比很大的数
                {
                    if(a[k] > a[j])
                    {
                        if(2 * f[i][j] + 1 > ans)
                            ans = 2 * f[i][j] + 1;
                    }
                }
            }
        }
        printf("%d\n", ans);
    }

    return 0;
}

抱歉!评论已关闭.