zoj 2527 Series

来源:互联网 发布:idea 10开发java web 编辑:程序博客网 时间:2024/06/08 17:49
/*zoj_2527    dp题意:从给出的序列选出n个数,组成等差数列,求最大的n思路:dp[i][j]表示以num[i]、num[j]开头的数列,记忆化搜索易写      这题要注意的是必须剔除相等元素,再查找数时可用二分。*/#include <iostream>#include <cstdio>#include <string.h>#include <algorithm>using namespace std;int dp[1010][1010],num[1010];int getdp( int a,int b,int n ){    int i,j;    if( dp[a][b]!=-1 )  return dp[a][b];    dp[a][b]=2;    if( b==n-1 )    return dp[a][b];    for( i=b+1;i<n;i++ )    {        if( num[i]==2*num[b]-num[a] )        {            dp[a][b]=max( dp[a][b],3 );            for( j=i+1;j<n;j++ )                if( num[j]==3*num[b]-2*num[a] )                {                    dp[a][b]=max( dp[a][b],getdp( i,j,n )+2 );                }        }    }    return dp[a][b];}int main(){    int i,j,maxi,n,m,co;    while( scanf( "%d",&n )!=EOF )    {        for( i=0;i<1010;i++ )            for( j=0;j<1010;j++ )                dp[i][j]=-1;        m=0;    co=1;   maxi=-1;        for( i=0;i<n;i++ )        {            scanf( "%d",&num[i] );        }        sort( num,num+n );        for( i=0;i<n-1;i++ )    //剔除相等元素        {            if( num[i]==num[i+1] )  co++;            else            {                maxi=max( co,maxi );                num[ m++ ]=num[i];                co=1;            }        }        if( num[n-1]==num[n-2] )    maxi=max( co,maxi );        num[m++]=num[n-1];        for( i=0;i<m-1;i++ )            for( j=i+1;j<m;j++ )                maxi=max( maxi,getdp( i,j,m ) );        printf( "%d\n",maxi );    }    return 0;}

原创粉丝点击