Linking
题意:
给定一个数列A,求出满足下面要求的最长子序列:
选出 m 个位置,满足
A
b
1
+
A
b
2
=
A
b
3
+
A
b
4
=
⋯
=
A
b
m
−
1
+
A
b
m
A_{b_1} + A_{b_2} = A_{b_3} + A_{b_4} = \cdots = A_{b_{m-1}} + A_{b_m}
Ab1+Ab2=Ab3+Ab4=⋯=Abm−1+Abm。(m为偶数)
( 2 ≤ n ≤ 1 0 5 , 1 ≤ A i ≤ 100 ) (2\le n \le 10^5, 1≤Ai≤100) (2≤n≤105,1≤Ai≤100)
思路:
Ai 很小,可以暴力枚举两数之和,取所有情况的最大值。
每次判断,求出左边和当前位置最近的满足两数之和的位置,然后线性dp。
Code
#include<bits/stdc++.h>
using namespace std;
const int N = 200010, mod = 1e9+7;
int T, n, m;
int a[N], ans;
int pre[N], f[N];
void pd(int x)
{
for(int i=1;i<=n;i++) pre[i] = 0, f[i] = 0;
for(int i=1;i<=n;i++)
{
f[i] = f[i-1];
if(a[i] < x && pre[x-a[i]])
{
f[i] = max(f[i], f[pre[x-a[i]]-1] + 2);
ans = max(ans, f[i]);
}
pre[a[i]] = i;
}
}
signed main(){
Ios;
cin >> n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2;i<=200;i++) pd(i);
cout << ans;
return 0;
}