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
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 }