题目链接

题目的大概意思是给出一个序列,这个序列的数字都是整数,范围是-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. apache与tomcat连接
  2. JS组件系列——开源免费图表组件:Chart.js
  3. 数论分块练习([CF830 C]Bamboo Partition + [hdu 6395]Sequence )
  4. ffmpeg处理RTMP流媒体的命令 发送流媒体的命令(UDP,RTP,RTMP)
  5. GitHub还是GitLab?谈谈两者的区别
  6. 20155229《网络对抗技术》Exp2:后门原理与实践
  7. xtrabackup备份还原的具体操作过程
  8. mysql limit 算法_MYSQL分页limit速度太慢
  9. 冰雪传奇刷怪计时器_冰雪传奇BOSS计时器
  10. Android优雅地判断软键盘弹出状态
  11. 干货 | Windows 10如何卸载新版Edge浏览器
  12. java省市区树_Java后台以树形结构返回省市区三级区域信息
  13. 计算机专业保研面试备考:概率论
  14. 计算机中丢失audiodsp,AudioDsp.dll(缺失AudioDsp.dll文件修复工具)V1.0 免费版
  15. el-select 远程搜索时 没有箭头图标
  16. 21天学会c++(英汉对照,个人翻译,水平有限,供参考)-------第2天
  17. 时间序列分析-针对时间序列的特殊方法
  18. siri 苹果语音控制功能
  19. python爬虫(爬取图片)
  20. DaVinci Resolve 17 mac新功能

热门文章

  1. Python使用sftp实现上传和下载功能(实例代码)
  2. [tensorflow]tensorflow 顺序模型(Sequential model)
  3. struts的工作原理
  4. 解剖 RxJava 之过滤操作符
  5. 互联网时代: 从Uber的供需匹配看开发需求
  6. C++的MFC 与 HTML 双向通讯
  7. Windows下AndroidStudio 中使用Git(AndroidStudio项目于GitHub关联)
  8. 支付宝接口调试经验总结
  9. objective-c(iOS5) 中weak和strong使用的区别
  10. Multiavatar 多元文化头像生成器