bzoj 3357 [Usaco2004]等差数列 dp

[Usaco2004]等差数列

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 486  Solved: 227
[Submit][Status][Discuss]

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

HINT

 
想到n^2logn的算法,f[i][j]表示结尾为i公差为j的答案
用map维护
 1 #include<cstring>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cmath>
 6 #include<queue>
 7 #include<vector>
 8 #include<map>
 9 
10 #define N 2007
11 #define mod 1000000007
12 #define fzy pair<int,int>
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
18     while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
19     return x*f;
20 }
21 
22 int n;
23 map<int,int>f[N];
24 int a[N];
25 
26 int main()
27 {
28      n=read();
29      for(int i=1;i<=n;i++)
30           a[i]=read();
31      if(n==1)
32      {
33           printf("1\n");
34           return 0;
35      }
36      int ans=0;
37      for(int i=1;i<=n;i++)
38      {
39           for(int j=1;j<i;j++)
40           {
41               f[i][a[i]-a[j]]=max(max(f[i][a[i]-a[j]],f[j][a[i]-a[j]]+1),2);
42               ans=max(f[i][a[i]-a[j]],ans);
43           }
44      }
45      printf("%d\n",ans);
46 }

 

 

posted @ 2018-04-15 16:00  Kaiser-  阅读(253)  评论(0编辑  收藏  举报