等差数列(DP)
本题 很容易 得出一个 的解法,令 表示以 结尾,公差为 的最长等差数列的长度,由于公差太大,因此我们需要用到 ,即 用 来进行 ,因此复杂度为 。
显然上述做法是会 的。
我们考虑去优化上面的 。
对于一个等差数列的连续三项 ,他们满足一个式子 ,那么我们可以定义 表示以 为最后两项的最长等差数列的长度。
对于一个有序数组 来说,我们可以枚举 ,然后从利用双指针进行 ,令 ,每次判断 和 的值
- 直接更新 ,然后令 ,继续更新 数组
- 由于 过大,那么我们需要令 ,使得 的值增加
- 由于 过小,那么我们需要令 $ L--,使得 的值减少
注意初始化: 均为
#include <bits/stdc++.h>
using namespace std;
const int N = 5001;
int a[N];
int f[N][N];
signed main() {
int n; scanf("%d", &n);
for(int i = 1; i <= n; i ++ ) {
scanf("%d", a + i);
}
if(n <= 2) {
printf("%d\n", n); return 0;
}
sort(a + 1, a + 1 + n);
int ans = 2;
for(int i = 1; i <= n; i ++ ) {
for(int j = i + 1; j <= n; j ++ ) {
f[i][j] = 2;
}
}
for(int i = 1; i <= n; i ++ ) {
int L = i - 1, R = i + 1;
while(L >= 1 && R <= n) {
if(a[i] * 2 == a[L] + a[R]) {
f[i][R] = max(f[i][R], f[L][i] + 1);
ans = max(ans, f[i][R]);
L --;
} else if(a[i] * 2 > a[L] + a[R]) {
R ++;
} else {
L --;
}
}
}
printf("%d\n", ans);
return 0;
}
分类:
DP
, 代码源每日一题 Div1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!