bzoj 3357 [Usaco2004]等差数列 dp
[Usaco2004]等差数列
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 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
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 }