hdu 4604 2013多校

来源:互联网 发布:网络主播排行榜2017 编辑:程序博客网 时间:2024/06/13 01:50

网上很多AC代码都是错的  用这组数据可测

 

10
2 2 2 2 1 2 2 2 3 3

 

正确答案是 10

 

大部分都是没有把正确的相同的去掉

 

http://www.cnblogs.com/woaishizhan/archive/2013/07/23/3209328.html这个人的代码还是比脚靠谱的, 但是还是通不过着个数据,做了些小改动后,代码如下,思路同上BOLG

#include <cstdio>#include <cstring>#include <vector>#include <queue>#include <algorithm>#include <iostream>#define maxn 100010using namespace std;int val[maxn];int N;void DP(int num[],int dp[],int same[]){    int i,j;    vector<int> v;    for(i=0;i<N;i++)    {        int a,b;        a=lower_bound(v.begin(),v.end(),num[i])-v.begin();        b=upper_bound(v.begin(),v.end(),num[i])-v.begin();        if(b==v.size())        {            v.push_back(num[i]);            dp[i]=v.size();        }        else        {            v[b]=num[i];            dp[i]=b+1;        }        same[i]=min(same[i],b-a+1);//same[i] = b-a+1;    }}int dp1[maxn],dp2[maxn];int same[maxn];int main(){   // freopen("input.txt","r",stdin);    int i,j;    int T;    scanf("%d",&T);    while(T--)    {memset(same, 0x3f, sizeof(same));        scanf("%d",&N);        for(i=0;i<N;i++)        {            scanf("%d",&val[i]);        }        reverse(val,val+N);        DP(val,dp1,same);        for(i=0;i<N;i++)        {            val[i]=-val[i];        }        DP(val,dp2,same);        int ans=0;        for(i=0;i<N;i++)        {            ans=max(ans,dp1[i]+dp2[i]-same[i]);        }        printf("%d\n",ans);    }    return 0;}