N个不同的正整数,找出由这些数组成的最长的等差数列。

例如:1 3 5 6 8 9 10 12 13 14
等差子数列包括(仅包括两项的不列举)
1 3 5
1 5 9 13
3 6 9 12
3 8 13
5 9 13
6 8 10 12 14

其中6 8 10 12 14最长,长度为5。
输入
第1行:N,N为正整数的数量(3 <= N <= 10000)。
第2 - N+1行:N个正整数。(2<= A[i] <= 10^9)
输出
最长等差数列的长度。
输入样例
10
1
3
5
6
8
9
10
12
13
14
输出样例
5

等差序列的规律是 2*a[i]=a[i-1]+a[i+1];

分开看就是 i,j,k

以j为轴,i找左边,k找右边,

确定i,j,k可以组成等差数列的时候

之后的状态转移方程 dp[j][k]=dp[i][j]+1;

k找到的时候 证明 i,j,k可以组成等差序列,所以dp[j][k]=dp[i][j]+1;

比如 1 2 3 4 5 6

dp[1][2]=2;

dp[2][3]=dp[1][2]+1;

dp[3][4]=dp[2][3]+1;

#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
short dp[maxn][maxn];
int a[maxn];
int main() {
	int n;
	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++) {
		for (int j = i + 1; j <= n; j++) {
			dp[i][j] = 2;
		}
	} 
	int ans = 2;
	for (int j = 1; j <= n; j++) {
		int i = j - 1, k = j + 1;
		while (i >= 1 && k <= n) {
			if (a[j] * 2 == a[i] + a[k]) {
				dp[j][k] = dp[i][j] + 1;
				ans = max(ans, (int)dp[j][k]);
				i--; k++;
			} else if (a[j] * 2 > a[i] + a[k]) {
				k++;
			} else {
				i--;
			}
		}
	}
	cout << ans << endl;
	return 0;
}