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

来源:互联网 发布:java模拟器安卓版6.0.1 编辑:程序博客网 时间:2024/06/06 02:22

首先要去学习最长公共上升子序列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\n",ans);    }    return 0;}
0 0
原创粉丝点击