回文

using namespace std;
const int N=2000+10;
int a[N],b[N][N],v[N];
int main()
{
    int n,i,j;
    while(~scanf("%d",&n))
    {
        memset(v,0,sizeof(v));
        memset(b,0,sizeof(b));
        for(i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            v[a[i]]=1;//用来判断a[i]+d是否存在;
        }
        if(n<=2)  printf("%d\n",n);
        else
        {
            sort(a+1,a+1+n);
            int m1=1,m=0,k=a[n]-a[1];//用m储存最大长度;并求出公差最大值;
            for(i=2; i<=n; i++)//公差为0的情况;
            {
                if(a[i]==a[i-1])  m1++;
                else  m1=1;
                m=max(m,m1);
            }
            for(i=1; i<=n; i++)//两层循环;
                for(j=1; j<=k; j++)//公差的所有可能值,注意公差为0已经在上面判断过了;
                {
                    if(a[i]+j>a[n]) break;
                    if(v[a[i]+j])//如果存在;
                    {
                        if(!b[j][a[i]])
                            b[j][a[i]]=1;表示以a[i]为首项, 公差为d,所以值要赋为1;
                        b[j][a[i]+j]=b[j][a[i]]+1;//关键,这样就是层层更新递推;
                    }
                    m=max(b[j][a[i]+j],m);
                }
            printf("%d\n",m);
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_41925919/article/details/80437161