bzoj 3357 等差数列

Description

    约翰发现奶牛经常排成等差数列的号码.他看到五头牛排成这样的序号:“1,4,3,5,7”
很容易看出“1,3,5,7”是等差数列.
    给出N(1≤N≤2000)数字AI..AN(O≤Ai≤10^9),找出最长的等差数列,输出长度.

Input

    第1行:一个整数N.
    第2到N+1行:每行一个整数Ai,表示牛的号码.

Output

 
    最长等差数列的长度.

Sample Input

5
1
4
3
5
7

Sample Output

4
 
思路 :f[i][j]表示以第i个数结尾的公差为j,最长的等差数列的长度。f可以做成map
 1 #include<bits/stdc++.h>
 2 using namespace std;   
 3 #define R register int
 4 #define rep(i,a,b) for(R i=a;i<=b;i++) 
 5 #define Rep(i,a,b) for(R i=a;i>=b;i--)  
 6 #define ms(i,a)    memset(a,i,sizeof(a))  
 7 #define gc()       getchar() 
 8 template<class T>void read(T &x){
 9     x=0; char c=0; 
10     while (!isdigit(c)) c=gc(); 
11     while (isdigit(c))  x=x*10+(c^48),c=gc(); 
12 }
13 int const N=2001;  
14 int n,a[N];  
15 map<int,int> f[N];  
16 int main(){
17     read(n);  
18     rep(i,1,n) read(a[i]);  
19     if(n<=2) {
20         printf("%d\n",n); return 0;  
21     }
22     int ans=0;  
23     rep(i,2,n) rep(j,1,i-1){
24         f[i][a[i]-a[j]]=max(f[i][a[i]-a[j]],f[j][a[i]-a[j]]+1);  
25         ans=max(ans,f[i][a[i]-a[j]]);  
26     } 
27     cout<<ans+1<<endl; 
28     return 0;  
29 }
View Code

 

posted @ 2019-01-15 15:04  zjxxcn  阅读(181)  评论(0编辑  收藏  举报