hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)

首先要去学习最长公共上升子序列LCIS,然后是对n*n效率的算法进行优化,这里要注意的是可以求出来的序列中间可以有一个最高的。刚开始将输入的数组进行逆置,写下来发现这可能存在问题。不过具体是什么也没有仔细想明白。

#include<bits/stdc++.h>
using namespace std;

int dp[300][300],a[300];

int main()
{
    int n,_,i,j,k,ans,mx,t;
    scanf("%d",&_);
    while(_--)
    {
        scanf("%d",&n);
        for(i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
        }
        memset(dp,0,sizeof(dp));
        ans=1;
        for(i=1; i<=n; i++)
        {
            mx=0;
            for(j=n; j>i; j--)
            {
                dp[i][j]=dp[i-1][j];
                if(a[i]>a[j]&&mx<dp[i-1][j])
                    mx=dp[i-1][j];

                if(a[i]==a[j]&&dp[i][j]<mx+1)
                    dp[i][j]=mx+1;

                if(2*dp[i][j]>ans)
                    ans=2*dp[i][j];

                for(k=i; k<j; k++)
                    if(a[k]>a[j])
                    {
                        if(2*dp[i][j]+1>ans)
                            ans=dp[i][j]*2+1;
                    }
            }

        }
        printf("%d
",ans);

    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

原文地址:https://www.cnblogs.com/xryz/p/4847896.html