基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题
 收藏
 关注
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
第1行:N,N为正整数的数量(3 <= N <= 10000)。
第2 - N+1行:N个正整数。(2<= A[i] <= 10^9)
Output
最长等差数列的长度。
Input示例
10
1
3
5
6
8
9
10
12
13
14
Output示例
5

    一开始想的是dp+哈希,复杂度是O(N*N*log(N)),结果T了,后来看题解发现还有这种优化操作。对于等差数列  a[k],a[i],a[j],必然满足a[i]*2==a[k]+a[j],我们可以枚举所有的i,
然后用两个指针前后移动找到符合要求的状态再进行转移,复杂度O(N^2);
    
 #include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<stack>
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<time.h>
#include<algorithm>
using namespace std;
#define mp make_pair
#define debug puts("debug")
#define LL long long
#define pii pair<int,int>
map<int,int>M;
short f[][];
int a[],N;
int main(){
int n,i,j,k;
cin>>n;
N=n;
for(i=;i<=n;++i) {
scanf("%d",a+i);
}
sort(a+,a++n);
short ans=;
for(i=;i<=n;++i){
int j=i+,k=i-;
while(k>=&&j<=n){
if(a[k]+a[j]<a[i]*) j++;
else if(a[k]+a[j]>a[i]*) k--;
else{
f[i][j]=max(f[i][j],short(max(f[k][i],(short))
+));
ans=max(ans,f[i][j]);
k--;
j++;
}
}
}
cout<<ans<<endl;
return ;
}

51nod-1055-最长等差数列(dp+优化)的更多相关文章

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

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

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

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

  3. 51nod 1055 最长等差数列

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1055 题意: 思路:先固定一个位置,然后从该中心点出发向两边扫,确实很难 ...

  4. 【51Nod】1055 最长等差数列 动态规划

    [题目]1055 最长等差数列 [题意]给定大小为n的互不不同正整数集合,求最长等差数列的长度.\(n \leq 10000\). [算法]动态规划 两个数之间的差是非常重要的信息,设\(f_{i,j ...

  5. 51nod 1055:最长等差数列

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

  6. 51nod1055 最长等差数列

    完全一脸懵逼!.dp[i][j]表示i,j为相邻的两项的最大值.两个指针两边扫的思想好劲啊这个!%%% #include<cstdio> #include<cstring> # ...

  7. 51Nod - 1055:最长等差数列 (求最长的等差数列)

    N个不同的正整数,找出由这些数组成的最长的等差数列.     例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不列举) 1 3 5 1 5 9 13 3 6 9 12 ...

  8. 『最长等差数列 线性DP』

    最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不 ...

  9. 51nod 1376 最长上升子序列的数量 | DP | vector怒刷存在感!

    51nod 1376 最长上升子序列的数量 题解 我们设lis[i]为以位置i结尾的最长上升子序列长度,dp[i]为以位置i结尾的最长上升子序列数量. 显然,dp[i]要从前面的一些位置(设为位置j) ...

随机推荐

  1. poj2176 Folding【区间DP】

    Folding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1841   Accepted: 642   Special ...

  2. android.os.Handler

    android.os.handler A Handler allows you to send and process Message and Runnable objects associated ...

  3. 多线程下载图片,滑动tableView崩溃--资源抢夺问题

    最近练习使用NSoperation模拟SDWebImage下载图片,发生了崩溃的问题,还专门写博客记录这件事情: http://www.cnblogs.com/tufei7/p/7074030.htm ...

  4. Mongo副本集的配置以及php node.js连接使用副本集

    最近弄了下mongodb的副本集, 首先说下没有认证情况的副本集,相对比较简单,因为环境有限,我在同一台服务器上做了模拟. --rest参数是打开web监控页面,比如我们这里监听37017端口,则打开 ...

  5. Block Towers---cf626c(二分)

    题目链接:http://www.codeforces.com/contest/626/problem/C 题意是有一群小朋友在堆房子,现在有n个小孩每次可以放两个积木,m个小孩,每次可以放3个积木,最 ...

  6. 一只青蛙从第一级台阶跳到第n级,每次可以跳任意级,共有多少种跳法,并写出递推式

    是斐波那契数列问题 假设f(n)是n个台阶跳的次数:(假设已经调到第n个台阶,最后一次是由哪个台阶跳上来的) f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) ...

  7. 模仿Masonary写一个计算器

    1.CaculatorMaker @interface CaculatorMaker : NSObject @property(nonatomic,assign)int result; -(Cacul ...

  8. POI - Excel API

    一.概述    1. Apache POI是Apache软件基金会的开放源码函式库,POI提供API给java程式对Microsoft Office格式档案读和写的功能.    2. 结构       ...

  9. jdk eclipse SDK下载安装及配置教程

    原文地址https://blog.csdn.net/dr_neo/article/details/49870587 最新鲜最详细的Android SDK下载安装及配置教程 最近Neo突发神经,想要将学 ...

  10. #C++初学记录(并查集)

    并查集 题目 今天是伊格那丢的生日.他邀请了很多朋友.现在该吃晚饭了.伊格那丢想知道他至少需要多少张桌子.你必须注意到并不是所有的朋友都认识对方,而且所有的朋友都不想和陌生人待在一起.这个问题的一个重 ...