C. Almost Arithmetical Progressiontime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputGena loves sequences of numbers. Recently, he has discovered a new type of sequences which he called an almost arithmetical progression. A sequence is an almost arithmetical progression, if its elements can be represented as:
- a1 = p, where p is some integer;
- ai = ai - 1 + ( - 1)i + 1·q (i > 1), where q is some integer.
Right now Gena has a piece of paper with sequence b, consisting of n integers. Help Gena, find there the longest subsequence of integers that is an almost arithmetical progression.
Sequence s1, s2, ..., sk is a subsequence of sequence b1, b2, ..., bn, if there is such increasing sequence of indexes i1, i2, ..., ik (1 ≤ i1 < i2 < ... < ik ≤ n), that bij = sj. In other words, sequence s can be obtained from b by crossing out some elements.
InputThe first line contains integer n (1 ≤ n ≤ 4000). The next line contains n integers b1, b2, ..., bn (1 ≤ bi ≤ 106).
OutputPrint a single integer — the length of the required longest subsequence.
Examplesinput2
3 5output2input4
10 20 10 30output3NoteIn the first test the sequence actually is the suitable subsequence.
In the second test the following subsequence fits: 10, 20, 10.
dp[i][j]表示以a[i]为尾,a[j]是这个序列前一个数的最长长度
dp[i][j]=max(dp[j][k]+1){0<=k<j&&a[k]==a[i]}但这样复杂度是O^3
但是dp[j][k]中的k肯定是选择最靠近j的那个,假如有k1<k2<……<kx<j,dp[j][kx]>=dp[j][k(1~x-1)]
这样的话,复杂度就变成O^2了
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <stack> typedef long long ll; #define X first #define Y second #define mp(a,b) make_pair(a,b) #define pb push_back #define sd(x) scanf("%d",&(x)) #define Pi acos(-1.0) #define sf(x) scanf("%lf",&(x)) #define ss(x) scanf("%s",(x)) #define maxn 10000000 #include <ctime> const int inf=0x3f3f3f3f; const long long mod=1000000007; using namespace std; int dp[5005][5005]; int num[5005]; int main() { #ifdef local freopen("in","r",stdin); //freopen("data.txt","w",stdout); int _time=clock(); #endif int n; cin>>n; for(int i=1;i<=n;i++) sd(num[i]); int ans=0; int la; for(int i=1;i<=n;i++) { la=0; for(int j=0;j<i;j++) { dp[i][j]=dp[j][la]+1; if(num[i]==num[j])la=j; ans=max(dp[i][j],ans); } } cout<<ans<<endl; #ifdef local printf("time: %d ",int(clock()-_time)); #endif }