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;}