1. 程式人生 > >BZOJ 3357--[Usaco2004]等差數列(STL&DP)

BZOJ 3357--[Usaco2004]等差數列(STL&DP)

out ++ long long \n fin 。。 putc names turn

3357: [Usaco2004]等差數列

Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 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

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)