<更新提示>

<第一次更新>


<正文>

最长等差数列(51nod 1055)

Description

N个不同的正整数,找出由这些数组成的最长的等差数列。

例如:1 3 5 6 8 9 10 12 13 14

等差子数列包括(仅包括两项的不列举)

1 3 5

1 5 9 13

3 6 9 12

3 8 13

5 9 13

6 8 10 12 14

其中6 8 10 12 14最长,长度为5。

Input Format

第1行:N,N为正整数的数量(3 <= N <= 10000)。 第2 - N+1行:N个正整数。(2<= A[i] <= 10^9)

Output Format

最长等差数列的长度。

Sample Input

10
1
3
5
6
8
9
10
12
13
14

Sample Output

5

解析

对于一个序列的特定最优值求解,应该很容易想到是线性DP。第一步首先排序是很容易想到的。

第一个突破口在状态的设置,如果直接用n设置状态,发现会很难处理转移的问题。

\(f[i][j]\)代表以\(a_i\)为第一项,\(a_j\)为第二项所构成的等差数列的最长长度\((i<j)\)

考虑若\(a_k\)可以作为这个等差数列的第三项,且满足\((i<j<k)\),那么\(f[i][j]=f[j][k]+1\)。

由等差数列的性质可以得知,当\(a_k\)可以作为第三项时:\(a_j*2=a_i+a_k\)。

此时我们枚举\(j\),将\(i\),\(k\)设为指针利用性质的大小关系去扫描即可,可以做到时间复杂度\(O(n^2)\)。

当然,由于\((i<j<k)\),所以转移时需要倒序枚举。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
inline void read(int &k)
{
int w=0,x=0;char ch;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
k=(w?-x:x);return;
}
const int N=10000+80;
int n,a[N];
short int f[N][N]={},ans=2;
inline void input(void)
{
read(n);
for(int i=1;i<=n;i++)read(a[i]);
}
inline void init(void)
{
sort(a+1,a+n+1);
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
f[i][j]=2;
}
inline void dp(void)
{
for(int j=n-1;j>=2;j--)
{
int i=j-1,k=j+1;
while(i>=1&&k<=n)
{
if(a[j]*2==a[i]+a[k])
{
f[i][j]=f[j][k]+1;
ans=max(ans,f[i][j]);
k++,i--;
}
if(a[j]*2>a[i]+a[k])k++;
if(a[j]*2<a[i]+a[k])i--;
}
}
}
int main(void)
{
input();
init();
dp();
printf("%d\n",ans);
return 0;
}

考点:灵活的状态设置。


<后记>

『最长等差数列 线性DP』的更多相关文章

  1. 『最大M子段和 线性DP』

    最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...

  2. 『The Counting Problem 数位dp』

    The Counting Problem Description 求 [L,R]内每个数码出现的次数. Input Format 若干行,一行两个正整数 L 和 R. 最后一行 L=R=0,表示输入结 ...

  3. 『快乐链覆盖 树形dp』

    快乐链覆盖 Description 给定一棵 n 个点的树,你需要找至多 k 条互不相交的路径,使得它们的长度之和最大 定义两条路径是相交的:当且仅当存在至少一个点,使得这个点在两条路径中都出现 定义 ...

  4. 『保卫王国 树上倍增dp』

    保卫王国 Description Z 国有n座城市,n - 1条双向道路,每条双向道路连接两座城市,且任意两座城市 都能通过若干条道路相互到达. Z 国的国防部长小 Z 要在城市中驻扎军队.驻扎军队需 ...

  5. 『土地征用 Land Acquisition 斜率优化DP』

    斜率优化DP的综合运用,对斜率优化的新理解. 详细介绍见『玩具装箱TOY 斜率优化DP』 土地征用 Land Acquisition(USACO08MAR) Description Farmer Jo ...

  6. 51 nod 1055 最长等差数列(dp)

    1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 N个不同的正整数,找出由这些数组成的最长的等差数列.     例如:1 3 5 6 8 9 ...

  7. 线性DP总结(LIS,LCS,LCIS,最长子段和)

    做了一段时间的线性dp的题目是时候做一个总结 线性动态规划无非就是在一个数组上搞嘛, 首先看一个最简单的问题: 一,最长字段和 下面为状态转移方程 for(int i=2;i<=n;i++) { ...

  8. 51nod-1055-最长等差数列(dp+优化)

    1055 最长等差数列  基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  关注 N个不同的正整数,找出由这些数组成的最长的等差数列.     例如:1 3 ...

  9. 51Nod 1055 最长等差数列 (dp+哈希)

    1055 最长等差数列  基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  关注 N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 ...

随机推荐

  1. java中的时间类型

    java时间的格式 SimpleDateFormat dateFormate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Stri ...

  2. SpringBoot使用prometheus监控

    本文介绍SpringBoot如何使用Prometheus配合Grafana监控. 1.关于Prometheus Prometheus是一个根据应用的metrics来进行监控的开源工具.相信很多工程都在 ...

  3. C++ 使用 curl 进行 http 请求(GET、POST、Download)的封装

    修改自网路 CommonTools.h /* * CommonTools.h * * Created on: 2018年8月2日 * Author: didi */ #include <iost ...

  4. toString

    在java中使用toString: 如果在Java在输出定义一个Person类 然后实例化person  per 直接用system.out.println(per);无法得到我们想要的实例化内容 p ...

  5. 数据分析——matplotlib

    基础 # coding=utf-8 import matplotlib.pyplot as pt import numpy as np from matplotlib import font_mana ...

  6. section标签实现文字滚动

    h5新增样式 section标签 使用demo //h5新增属性 h5新增滚动的标签 <marquee> <div style="padding-left: 20px;ma ...

  7. python学习笔记(4)

    .................................................................................................... ...

  8. vue相关文件说明(基于vue2.0)

    1.config:生产,开发环境配置参数 2.static:第三方资源,这里面的文件直接写路径,不能用'import'导入 3.node_modules:引入一些依赖包 4..babelrc:定义了E ...

  9. 发现一款适合php网站的管理软件——kodexplorer,能取代ftp

    今天偶然看到可以利用可道云来管理网站的文件.可道云不需要数据库,因此搭建非常简单.搭建的方法也很简单.传统的 WordPress 站点的文件管理,通常是是通过 FTP 或者服务器面板自带的文件管理器来 ...

  10. Linux Rabbit的使用

    安装RabbitMQ 1.安装Erlang yum -y install epel-release yum -y update yum -y install erlang socat yum -y i ...