我绞尽脑汁想一个更好的算法,然而不能如愿,只好写一个n^3的了
很简单,就是暴力搜索(还好n<100)
先排序,然后循环i=1ton,j=i+1ton
把a[i]a[j]确定为等差数列开始的两个数,确定公差,然后用search()搜这个数列的长度
取所有的最大值即可
代码如下:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define Size 105 using namespace std; int a[Size]; int N; int search(int p,int d){//参数:开始位置,公差。 int num=a[p]+d; int cnt=0; for(p+=1;p<=N;p++){ if(a[p]==num){ cnt++; num+=d; } } return cnt; } int main(){ cin>>N; for(int i=1;i<=N;i++){ cin>>a[i]; } sort(a+1,a+N+1); /*for(int i=1;i<=N;i++){ cout<<a[i]; } cout<<endl;*/ int ans=1; for(int i=1;i<=N;i++){ for(int j=i+1;j<=N;j++){ int d=a[j]-a[i]; ans=max(ans,search(j,d)+2);//注意+2,把a[i]a[j]算进去。(search()的结果是不包含这两个的) } } cout<<ans; return 0; }
另外在codevs的题解中看到了几个n^2的,发现好像不太对,如下:(竟然能过了...)
不明白是什么意思,不过可以找出反例:
4
1 3 7 9
答案应该是2
但是它的结果是3
......
sort(num + 1, num + N + 1);
int i,j,k;
for(i = 1; i <= N; i++)
{
for(j = i+1; j <= N; j++)
{
if(num[j] >= num[i])
cha[num[j] - num[i]] ++;
}
}
int r = 0;
for(i = 0; i <= 10000001; i++)
r = max(r, cha[i]);
printf("%d
",r + 1);
......