每日一题:Arithmetic Progressions

题目

从给定数列中能选出组成的最长等差数列长度为多少?$(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;
}
作者

Benboby

发布于

2020-10-04

更新于

2021-01-28

许可协议

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×