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
今日推荐
周排行