题目链接

题目的大概意思是给出一个序列,这个序列的数字都是整数,范围是-1,000,000,000 到1,000,000,000,数字的数量在2到1000,要求求出这个序列最长的等差子序列的长度。

我的想法,最长的相等的子序列作为maxlen的初始值,因为这个就是一个等差的子序列,然后把相同数字合并变为一个,这样可以减小数据量。

然后用排序一下,再用O(N*N*N)的复杂度求解,当然,这个可以做一些优化,当求最长等差子序列的时候,方法是先选定两个数字,得到这两个数字的差, 然后不断的求下一个数,通过map找这个数字,找到一个len加1,如果没找到直接跳出。

在这个地方我想应该还可以做一个优化,如果这两个数字已经被前面的等差序列找过的话就不用找了,比如2,3,4,5,当找2,3的时候,同时找过4,5 了,当找4,5的时候发现前面已经同时找过就不用再找下去了;另外,如果较大的一个数字后面的数字的个数已经小于maxlen了,就不用找了,但是这个优 化的效果不是很明显,于是就不做了。

我的代码速度比较慢,没有dp,其实就是死做的,0.46s通过,看看最快的是0.02s,还有很大的差距啊,附上代码:in C++

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<map>
 4 #include<vector>
 5 #include<cstdlib>
 6 using namespace std;
 7 
 8 int cmp(const void *a, const void *b)
 9 {
10 int *t1, *t2;
11 t1 = (int *)a;
12 t2 = (int *)b;
13 return (*t1) - (*t2) ;
14 }
15 int main()
16 {
17 map<int ,int> m;
18 int num[1000];
19 int n;
20 
21 while(scanf("%d",&n) != EOF)
22 {
23    int t = 0;
24    int maxlen = 0 ;
25    for(int i = 0 ; i < n ; i ++)
26    {
27     int temp;
28     scanf("%d",&temp);
29     if(!m[temp])
30      num[t++] = temp;
31     m[temp] ++ ;
32     if(maxlen < m[temp])
33      maxlen = m[temp] ;
34    }
35    qsort(num,t,sizeof(int),cmp);
36    for(int i = 0 ; i < t ; i ++)
37     for(int j = i + 1 ; j < t ; j ++)
38     {
39      int cur = num[j];
40      int len = 1 ;
41      int co = num[j] - num[i];
42      while(m[cur])
43      {
44       len ++ ;
45       cur += co ;
46      }
47      if(len > maxlen)
48       maxlen = len ;
49     }
50    printf("%d\n",maxlen);
51   
52 }
53 
54 return 0;
55 }

转载于:https://www.cnblogs.com/vivyli/archive/2010/02/05/1664063.html

ZOJ 2527题解相关推荐

  1. ZOJ 1410 题解

    题目链接:http://acm.zju.edu.cn/show_problem.php?pid=1410 又是一道简单题,以前做过一次,结果放弃了,今天看了一下,觉得还是比较简单于是下手了. 题目的大 ...

  2. 2019山东省赛B - Flipping Game ZOJ - 4114 题解

    题意: 初始有n个灯泡,灯泡状态是0和1,.现在有k轮操作,每次改变且仅改变m个的灯的状态,给定n盏灯的初始状态的最终状态,求有多少种解决改变灯的方案满足可以满足题目条件. 思路: 开始写的时候以为是 ...

  3. CONTINUE...? ZOJ - 4033

    CONTINUE...? ZOJ - 4033 题解:先计算一下总数sum是否是偶数,如果不是则不能分出来,如果是则从后面开始分,先把人分到1.3组,分完sum / 2这些人,如果恰好能够分成零,那么 ...

  4. ZOJ Monthly,Feburary 2012 部分题解

    题目链接:点击打开链接 ZOJ 3573 Under Attack 距离做这套题到写题解间隔比较久,题意有些忘了.. #include <iostream> #include <cs ...

  5. ZOJ Monthly, June 2014 月赛BCDEFGH题题解

    比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...

  6. ZOJ 3962 Seven Segment Display(数位DP)题解

    题意:给一个16进制8位数,给定每个数字的贡献,问你贡献和. 思路:数位DP,想了很久用什么表示状态,看题解说用和就行,其他的都算是比较正常的数位DP. 代码: #include<iostrea ...

  7. ZOJ 2747 Paint the Wall(离散化+暴力)题解

    题意:给你一个面,然后涂颜色,问你最后剩多少颜色,每种颜色面积. 思路:第一反应是二维线段树,代码又臭又长,可以做.但是这题暴力+离散化就可以过.可以看到他给的n只有100,也就是说最坏情况下会涂10 ...

  8. ZOJ 3829 Known Notation(贪心)题解

    题意:给一串字符,问你最少几步能变成后缀表达式.后缀表达式定义为,1 * 1 = 1 1 *,题目所给出的字串不带空格.你可以进行两种操作:加数字,交换任意两个字符. 思路:(不)显然,最终结果数字比 ...

  9. ZOJ 3609 Modular Inverse(扩展欧几里得)题解

    题意:求乘法逆元最小正正数解 思路:a*x≡1(mod m),则称x 是 a 关于 m 的乘法逆元,可以通过解a*x + m*y = 1解得x.那么通过EXGcd得到特解x1,最小正解x1 = x1 ...

最新文章

  1. mongodb的CRUD操作二查询
  2. (DCA)Decision Curve Analysis画图及意义
  3. 12306新版上线 还是不能选上下铺
  4. 版本管理 - Git 使用入门
  5. Python(字符串,列表,元组,字典)
  6. mybatis的dao向mapper.xml传入多参数
  7. TNS-03505 oracle用户可以tnsping通,普通用户tnsping报错
  8. Flex实现双轴条状图
  9. Linux 编译时查找错误字符,编译Linux内核时出现“fatal error: linux/netfilter/xt_dscp: No such file or directory”...
  10. linux内核zfs,ZFS与Linux文件系统的变革
  11. 桌面弹球游戏终结,含有全部代码
  12. libav(ffmpeg)简明教程(1)
  13. 伍楼阁使用的WordPress代码高亮插件使用说明
  14. 【mindspore】数据加载报错,提示The pointer[cnode] is null.
  15. 系统集成项目管理工程师历年真题下载地址
  16. win10任务栏设置——高效、美观!
  17. excel学习-sumifs函数(单条件求和+多条件求和+模糊条件求和)
  18. 如何快速撰写/总结国内外研究现状?
  19. short java_java基本数据类型short的使用(23)
  20. 关于Word的累加符号上下标变右标的解决办法

热门文章

  1. java的tomcat_JAVA程序获取Tomcat的运行状态
  2. 3D应用开发中的欧拉角和旋转矩阵
  3. ES6入门之let、cont
  4. Mysql用户管理(远程连接、授权)
  5. python 函数
  6. hive优化--增加减少map数
  7. 【Android】自己定义控件——仿天猫Indicator
  8. sketchup ruby编程之绘制梯段
  9. 上传分片切片大文件 XLSX/CSV/TXT
  10. 移动应用框架 Ionic 4 Ionic for Everyone