等差数列(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

Sample Output

4

/*
  f[i][a[j]]表示以a[i]结尾,并且上一个数是a[j]的最长等差数列。
  转移方程:f[i][a[j]]=max(f[i][a[j]],max(f[j][2*a[j]-a[i]]+1,2))
  然后用map转移。
  这里不得不说map的神奇:我刚开始写了一个玄学的算法,用自己造的数据跑,秒杀map,然后TLE。
  然而map AC了!!!AC了……
*/
#include<cstdio>
#include<iostream>
#include<map>
#define N 2010
using namespace std;
int a[N],n;
map<int,int> f[N];
int main(){
    scanf("%d",&n);
    if(n==1){
        printf("1");return 0;
    }
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    int ans=0;
    for(int i=2;i<=n;i++)
        for(int j=1;j<i;j++){
            f[i][a[j]]=max(f[i][a[j]],max(f[j][2*a[j]-a[i]]+1,2));
            ans=max(ans,f[i][a[j]]);
        }
    printf("%d",ans);
    return 0;
}
时间: 2024-10-11 05:34:08

等差数列(bzoj 3357)的相关文章

BZOJ 3357: [Usaco2004]等差数列

3357: [Usaco2004]等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 338  Solved: 160[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行:一个

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,

BZOJ 3357 Usaco2004 等差数列 动态规划

题目大意:给定一个长度为n的序列,求最大等差子序列 令f[i][j]表示当前等差数列最后一个数为a[i],倒数第二个数为j的最长长度 则有f[i][a[j]]=max{2,f[j][a[j]*2-a[i]]+1} 注意n=1时输出1 时间复杂度O(n^2logn) #include <map> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm>

AC日记——算术天才⑨与等差数列 bzoj 4373

4373 思路: 判断一个数列是否是等差数列: 1,最大值减去最小值==(区间个数-1)*k: 2,gcd==k: 3,不能有重复(不会这判断这一条,但是数据水就过了): 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 300005 struct TreeNodeType

bzoj 4373: 算术天才⑨与等差数列 hash

题目链接 题目大意:  给你n个数, 给两种操作, 一种给你l, r, k,问你[l, r]区间里的数排序后能否构成一个公差为k的等差数列. 另一种是将位置x的数变为y. 强制在线. 可以用hash来做, 用线段树保存一个区间里的最小值, 和, 以及平方的和. 然后每次询问, 假设这个区间构成等差数列,那么首项为这个区间的最小值, 然后按公式算出以minn为首项, k为公差的数列的和, 为a1*len+len*(len-1)/2*d, 然后算出平方的和, 相当于sigma(i : 0 to le

bzoj 4373 算术天才⑨与等差数列

4373: 算术天才⑨与等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.php?id=4373 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能否形成公差为k的等差数列.当然,他还会不断修改其中的某一项.为了不被他鄙视,你必须要

[BZOJ 1257] [CQOI2007] 余数之和sum 【数学】

题目链接:BZOJ - 1257 题目分析 首先, a % b = a - (a/b) * b,那么答案就是 sigma(k % i) = n * k - sigma(k / i) * i     (1 <= i <= n) 前面的 n * k 很容易算,那么后面的 sigma(k / i) * i,怎么办呢? 我们可以分情况讨论,就有一个 O(sqrtk) 的做法. 1)当 i < sqrtk 时,直接枚举算这一部分. 2)当 i >= sqrtk 时, k / i <=

Bzoj 2752 高速公路 (期望,线段树)

Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时候把\(r - 1\)就好了. 这里的期望显然就是路径的平均值. 期望值: \[\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}\] 下面部分可以直接算出: 上面这一部分比较难维护. 考虑每一条边会被走过多少次. \[ans = \su

bzoj [SDOI2014]数表 莫比乌斯反演 BIT

bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[gcd(i,j)]<=a] \] \[ f[]可以O(n)预处理出来 \] \[ \sum\limits_{k=1}^{n}f[k]*\sum\limits_{i=1}^{m}\sum\limits_{j=1}^{m}[gcd(i,j)==k] \] \[ \sum\limits_{k=1}^{n}