CODE[VS] 1006 等差数列
题目描述 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; }