您的位置:首页 > 其它

Codeforces Round #156 (Div. 2) C. Almost Arithmetical Progression

2016-05-09 23:35 489 查看
Gena 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.

Input
The first line contains integer n
(1 ≤ n ≤ 4000). The next line contains n integers
b1, b2, ..., bn
(1 ≤ bi ≤ 106).

Output
Print a single integer — the length of the required longest subsequence.

Examples

Input
2
3 5


Output
2


Input
4
10 20 10 30


Output
3


Note
In the first test the sequence actually is the suitable subsequence.

In the second test the following subsequence fits: 10, 20, 10.

分析:DP。

#include <cstdio>
#include <iostream>
#include <unordered_map>
using namespace std;
unordered_map <int,int>f;
int n,tot,a[4001],dp[4001][4001];
int main()
{
cin.sync_with_stdio(false);
cin>>n;
for(int i = 1;i <= n;i++)
{
cin>>a[i];
if(f.count(a[i]) == 0) f[a[i]] = ++tot;
}
int ans = 1;
for(int i = n-1;i;i--)
for(int j = i+1;j <= n;j++)
{
int J = f[a[j]];
int I = f[a[i]];
dp[i][J] = max(2,dp[i][J]);
dp[i][J] = max(dp[i][J],1+dp[j][I]);
ans = max(ans,dp[i][J]);
}
cout<<ans<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: