BZOJ 3357: [Usaco2004]等差数列( dp )

dp(x, p) 表示序列中第x个数, 上一个数是p构成的等差数列的最长. 转移时从[1, x)中枚举p = seq[] 就行了.时间复杂度O(n²logn)

---------------------------------------------------------------------------------

#include<bits/stdc++.h>
   
#define rep(i, n) for(int i = 0; i < n; i++)
#define Rep(i, n) for(int i = 1; i <= n; ++i)
#define clr(x, c) memset(x, c, sizeof(x))
 
using namespace std;
 
const int maxn = 2009;
 
int A[maxn], n;
map<int, int> dp[maxn];
 
int main() {
freopen("test.in", "r", stdin);
int ans = 0;
cin >> n;
rep(i, n) scanf("%d", A + i);
rep(i, n) rep(j, i)
ans = max(ans, dp[i][A[j]] = max(2, max(dp[i][A[j]], dp[j][A[j] * 2 - A[i]] + 1)));
if(n == 1) puts("1");
else cout << ans << endl;
return 0;
}

--------------------------------------------------------------------------------- 

3357: [Usaco2004]等差数列

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

HINT

Source

 

posted @ 2015-07-22 21:39  JSZX11556  阅读(307)  评论(0编辑  收藏  举报