/*
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;
}
zoj 2527 Series
最新推荐文章于 2017-10-25 18:55:06 发布