Almost Arithmetical Progression(dp)

Posted 1013star

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Almost Arithmetical Progression(dp)相关的知识,希望对你有一定的参考价值。

Almost Arithmetical Progression

 CodeForces - 255C 

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.

题意:找一个最长的锯齿形子串 例如10 30 10 30 10

思路:%大佬%大佬%大佬 大佬tql 

    因为数据在1e6而n只有4000,所以大佬说可以先搞一波离散化,然后开二维dp。dp[x][y]中x表示当前数的位置,y表示x这个位置上的数字前面的数,例如1 4 1 4 dp[3][4]代表当数字为1且其前面的数字为4时的最大子串长度。dp[3][4]=dp[2][1]+1,具体看代码。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=4010;
 7 int a[maxn],id[maxn],b[maxn];
 8 int dp[maxn][maxn];
 9 int n;
10 int main()
11 {
12     scanf("%d",&n);
13     for(int i=1;i<=n;i++)
14     {
15         scanf("%d",&a[i]);
16         id[i]=a[i];    
17     }
18     sort(id+1,id+1+n);
19     int len=unique(id+1,id+1+n)-(id+1);
20     for(int i=1;i<=n;i++)
21     {
22         a[i]=lower_bound(id+1,id+1+n,a[i])-id;
23     }
24     int ans=0;
25     for(int i=1;i<=n;i++)
26     {
27         for(int j=1;j<i;j++)
28         {
29             dp[i][a[j]]=dp[j][a[i]]+1;
30             ans=max(ans,dp[i][a[j]]);
31         }
32     }
33     printf("%d
",ans+1);
34     return 0;
35 }

 



以上是关于Almost Arithmetical Progression(dp)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 903D Almost Difference

字符串Almost Identical Programs

Almost Sorted Array

CodeForces 915D Almost Acyclic Graph

HDU5532 Almost Sorted Array

Almost Prime Numbers UVA