【Asia Yokohama Regional Contest 2018】Arithmetic Progressions

题目大意:给定 N(1<N<=5000) 个不同元素组成的集合,求从中选出若干数字组成的等差数列最长是多少。

题解:直接暴力有 \(O(n^3)\) 的算法,即:枚举等差数列的前两个值,再暴力枚举后面的值进行匹配即可,不过这样做直接去世。。
考虑 \(dp[i][j]\) 表示以第 i 个数为数列倒数第二位,第 j 个数为等差数列中的最后一位的最长序列的长度,则:\(dp[i][j]=max\{dp[l][i]+1,a[i]-a[l]=a[j]-a[i]\&\&0<l<i\}\)。不过这样还是要枚举 l 进行转移,考虑序列是有序的,对于外层枚举的 i 来说,j 的枚举过程中 i 是不变的,且 a[j] 的值是单调递增的,可以利用单调性,令 l 不断减小,即可得到答案,均摊复杂度为 \(O(n^2)\)。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=5010;

int n,a[maxn],dp[maxn][maxn],ans;

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++){
        int l=i-1;
        for(int j=i+1;j<=n;j++){
            dp[i][j]=2;
            while(l>=1&&a[j]-a[i]>a[i]-a[l])--l;
            if(l>=1&&a[j]-a[i]==a[i]-a[l])dp[i][j]=max(dp[i][j],dp[l][i]+1);
            ans=max(ans,dp[i][j]);
        }
    }
    printf("%d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10632593.html

时间: 2024-08-30 07:01:54

【Asia Yokohama Regional Contest 2018】Arithmetic Progressions的相关文章

2018-2019, ICPC, Asia Yokohama Regional Contest 2018 (Gym - 102082)

2018-2019, ICPC, Asia Yokohama Regional Contest 2018 A - Digits Are Not Just Characters 签到. B - Arithmetic Progressions 题意:从给定的集合中选出最多的数构成等差数列. 题解:数字排序后,设\(dp[i][j]\)表示等差数列最后一个数字为\(a[i]\),倒数第二个数字为\(a[j]\)的最大个数.然后对于每一位枚举 \(i\),\(lower\_bound()\)找有无合法的

Asia Yokohama Regional Contest 2018 B题 - Arithmetic Progressions(dp)

https://codeforces.com/gym/102082 题意 给定一些数,可以重新排序,求其中最长的等差数列的长度 思路 d[i][j]表示以a[i]和a[j]为开头的等差数列的最大长度,具体见代码 1 #define bug(x,y) cout<<"i="<<x<<": "<<y<<endl 2 #define IO std::ios::sync_with_stdio(0); 3 #inclu

Asia Yokohama Regional Contest 2018 G题 What Goes Up Must Come Down(树状数组求逆序对)

https://codeforces.com/gym/102082 题意: 给一个数组大小不超过1e5,每个数的值也是1e5以内,可以交换相邻两个数,求保证它呈现一个非递减再非递增的趋势的最小交换次数. 题解: 对每个数来说,只有两种情况,要么参与非递减部分要么参与非递增部分,对于前者它要移的次数就是在它之前与他构成的逆序对数,对于后者它要移的次数就是在它之后与他构成的逆序对数,那我们取较小的加入到答案就做完了. #define bug(x,y) cout<<"i="<

HDU 4474 Yet Another Multiple Problem【2012成都regional K题】 【BFS+一个判断技巧】

Yet Another Multiple Problem Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 3407    Accepted Submission(s): 825 Problem Description There are tons of problems about integer multiples. Despit

【BZOJ5248】【九省联考2018】一双木棋(搜索,哈希)

[BZOJ5248][九省联考2018]一双木棋(搜索,哈希) 题面 BZOJ Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且 这个格子的左侧及上方的所有格子内都有棋子. 棋盘的每个格子上,都写有两个非负整数,从上到下第i行中从左到右第j列的格子上的两个整数记作Aij.Bij.在 游戏结束后,菲菲和牛牛会分别计算自己

【BZOJ5251】【八省联考2018】劈配(网络流,二分答案)

[BZOJ5251][八省联考2018]劈配(网络流,二分答案) 题面 洛谷 BZOJ Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. 题目描述 轻车熟路的Zayid顺利地通过了海选,接下来的环节是导师盲选,这一阶段的规则是这样的: 总共n名参赛选手(编号从1至n)每人写出一份代码并介绍自己的梦想.接着由所有导师对这些选手进行排名. 为了避免后续的麻烦,规定不存在排名并列的情况. 同

The 43rd ACM International Collegiate Programming Contest Asia Shenyang Regional Contest

The 43rd ACM International Collegiate Programming Contest Asia Shenyang Regional Contest 原文地址:https://www.cnblogs.com/Accpted/p/11298233.html

The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online - H Traveling on the Axis-【思维模拟题目】

H Traveling on the Axis 作者: 浙江大学竞赛命题组 单位: ACMICPC 时间限制: 500 ms 内存限制: 64 MB 代码长度限制: 32 KB 传送门 BaoBao is taking a walk in the interval [0,n] on the number axis, but he is not free to move, as at every point (i−0.5) for all i∈[1,n], where i is an intege

2019.05.02 第九次训练 【2018-2019 ACM-ICPC, Asia Jiaozuo Regional Contest】

https://codeforc.es/gym/102028 A: B: C: D: E: F: G: H: I: J: K: L: 原文地址:https://www.cnblogs.com/ncu2019/p/10803307.html