题目描述 Description
给定n(1<=n<=100)个数,从中找出尽可能多的数使得他们能够组成一个等差数列.求最长的等差数列的长度.
输入描述 Input Description
第一行是一个整数n,接下来一行包括了n个数,每个数的绝对值不超过10000000.
输出描述 Output Description
对于每个输入数据,输出你所找出的最长等差数列的长度
样例输入 Sample Input
7
3
8
4
5
6
2
2
样例输出 Sample Output
5
数据范围及提示 Data Size & Hint
刚看这个题觉得可以用dp来做,但是考虑到当前状态存储的话,需要两个量,即长度和等差数列的差,所以不好做就不尝试这种方案了,所以就往简单处想,直接循环判断i和比i大的j这个状态时的等差数列长度,然后进行与max的比较即可.
当然,前提是有序的,所以我们首先选择进行快排
/*************************************************************************
> File Name: 等差数列.c
> Author: zhanghaoran
> Mail: chilumanxi@gmail.com
> Created Time: 2015年06月09日 星期二 18时19分07秒
************************************************************************/
#include <stdio.h>
#include <string.h>
int n;
int dp[101];
void swap(int *a, int *b){
int *t = a;
a = b;
b = t;
}
void quicksort(int a[], int left, int right){
int i, j, s, t;
if(left < right){
s = a[right];
i = left - 1;
for(j = left; j < right; j ++){
if(a[j] <= s){
t = a[++i];
a[i] = a[j];
a[j] = t;
}
}
t = a[right];
a[right] = a[i + 1];
a[i + 1] = t;
quicksort(a, left, i);
quicksort(a, i + 2, right);
}
}
int solve(int a[]){
int i, j;
int max = 0, res = 0;
int temp;
int t, s;
for(i = 0; i < n - 1; i ++){
for(j = i + 1; j < n; j ++){
temp = a[j] - a[i];
t = j;
s = i;
while(t < n){
if(a[t] - a[s] == temp){
s = t;
t ++;
res ++;
}
else t ++;
}
max = max > res ? max : res;
res = 0;
}
}
return max;
}
int main(void){
int i, j;
int a[101];
scanf("%d", &n);
for(i = 0; i < n; i ++){
scanf("%d", &a[i]);
}
quicksort(a, 0, n - 1);
printf("%d\n", solve(a) + 1);
return 0;
}