3357: [Usaco2004]等差数列
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 516 Solved: 241
[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
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=3357
Solution
f [ i ] [ j ] 表示以a[i]为末尾,j为倒数第2个数的最长等差数列长度。。
j的范围很大,用map维护。。。
代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #include<map> #define pa pair<LL,LL> #define LL long long using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline void Out(int a){ if(a>9) Out(a/10); putchar(a%10+'0'); } const LL inf=1e9+10; const LL mod=1e9+7; const int N=2050; int n,ans,a[N]; map<int,int> f[N]; int main(){ n=read(); if(n==1){ printf("1 ");return 0; } for(int i=1;i<=n;++i) a[i]=read(); for(int i=1;i<=n;++i){ for(int j=1;j<i;++j){ f[i][a[j]]=max(f[i][a[j]],2); f[i][a[j]]=max(f[i][a[j]],f[j][a[j]+a[j]-a[i]]+1); ans=max(ans,f[i][a[j]]); } } printf("%d ",ans); return 0; }
This passage is made by Iscream-2001.