题目
从给定数列中能选出组成的最长等差数列长度为多少?$(n \in [1, 5000], a[i] \in [1, 1e9])$
Solution
$dp[i][j]$ 表示 $a[i]$ 为等差数列最后一个数,$a[j]$ 为倒数第二个数。
排序后二维枚举 $i$ 和 $j$,二分找到对应的下标 $k$ 使得 $a[k]+a[i]=2*a[j]$ ,直接转移 $dp[i][j] = max(dp[i][j], dp[j][k] + 1)$。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <bits/stdc++.h> using namespace std; int n, res, a[5005], dp[5005][5005]; int main() { cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; sort(a, a + n); for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { int k = lower_bound(a, a + n, a[j] * 2 - a[i]) - a; if (a[k] == a[j] * 2 - a[i]) dp[i][j] = max(dp[i][j], dp[j][k] + 1); res = max(res, dp[i][j]); } } cout << res + 2 << endl; return 0; }
|