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:
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 indexesi1, 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.
The first line contains integer n (1 ≤ n ≤ 4000). The next line contains n integers b1, b2, ..., bn (1 ≤ bi ≤ 106).
Print a single integer — the length of the required longest subsequence.
2 3 5
2
4 10 20 10 30
3
In the first test the sequence actually is the suitable subsequence.
In the second test the following subsequence fits: 10, 20, 10.
题意:从给定的有序的序列中找最多的p,q,p,q.
dp[i][j]:代表在第 i 个数前一个数是 j 的情况下的最多值,
则:
dp[i][j]=dp[j][pre] + 1,
#include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #include<cmath> #include<iostream> #include <queue> #include <stack> #include<algorithm> #include<set> using namespace std; #define INF 1e8 #define eps 1e-8 #define LL long long #define maxn 100105 #define mod 1000000009 int n,a[4004],dp[4004][4004]; int main() { while(scanf("%d",&n)==1) { int ans=-1; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); int pre=0; for(int j=0;j<i;j++) { dp[i][j]=dp[j][pre]+1; if(a[i]==a[j]) pre=j; ans=max(ans,dp[i][j]); } } printf("%d\n",ans); } return 0; } /* 8 10 10 20 30 20 10 20 40 */