题目链接

题目的大概意思是给出一个序列,这个序列的数字都是整数,范围是-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. SQL Server备份的三个恢复模型
  2. 14.Python抠图脚本
  3. CSP认证201803-3 URL映射[C++题解]:字符串处理、模拟
  4. c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏
  5. SAP Spartacus LockFocusDirective的单步调试
  6. AWS加入.NET Foundation企业赞助商计划
  7. [系统安全]使用OD编写连连看外挂
  8. JavaScript的求模、取整、小数的取舍
  9. OC之protocol监听器的实现
  10. linux怎么初始命令,linux 第二季 初始linux 目录以及初始命令
  11. java后端服务运行原理_web服务的后台工作原理
  12. JavaScript 将两个数组合并,且删除重复的值
  13. PMP认证的教材更新到第几版了?
  14. winform直接控制云台_大疆DJI RSC2相机云台评测:折叠设计带来更多玩法
  15. 计算机vb期末试题及答案,VB期末考试试题及答案
  16. asp.net使用MailMessage发送邮件的方法
  17. windows无法连接到某个wifi_Windows无法连接到网络解决方法
  18. 网页通过Flash播放视频
  19. 手把手教你做智能手环
  20. 如何恢复sd卡数据呢?

热门文章

  1. [2016百度之星 - 初赛(Astar Round2A)]Snacks
  2. txt文件参数化200用户,返回在表格中查看只能看到100行数据
  3. 读写分离无效的大坑(新使用数据库读写分离的同学可以参考)
  4. laravel 模型事件几种用法
  5. python3学习之元组
  6. linux下i2c驱动笔记
  7. jBPM4.4之流程引擎对象ProcessEngine
  8. 迈克菲实验室:Flame病毒的深度分析
  9. 为 NokiaQt SDK增加新的Sym“.NET研究”bian SDK开发平台
  10. 你的公司有如下的症状吗?