BZOJ 3357--[Usaco2004]等差數列(STL&DP)
阿新 • • 發佈:2018-09-18
out ++ long long \n fin 。。 putc names turn
Submit: 516 Solved: 241
[Submit][Status][Discuss]
第1行:一個整數N.
第2到N+1行:每行一個整數Ai,表示牛的號碼.
1
4
3
5
7
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
Output
最長等差數列的長度.Sample Input
51
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\n");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\n",ans); return 0; }
This passage is made by Iscream-2001.
BZOJ 3357--[Usaco2004]等差數列(STL&DP)