http://poj.org/problem?id=1631

DP 最长上升子序列

最长上升子序列,因为n很大(n<40000),我开始写的O(n^2)的算法超时了。。。

学了一下O(n*logn)的方法,dp[i]表示当前状态下,所有长度为i的子序列中,末尾元素最小的那个子序列,的末尾元素值。

例如序列:a[6]:(1,3,5,4,6,2)

考虑到前6个元素的时候

长度为3的子序列有:(1,3,5)  (1,3,4)  (1,3,6)  (3,5,6)  (3,4,6)  那么dp[3] = 4;

长度为4的子序列有:(1,3,5,6)  (1,3,4,6)  那么dp[4] = 6;

开始时dp数组为空,依次遍历原序列a[n],对每一个当前元素a[i],都要更新一次dp数组

更新规则:从已有的dp数组中,找到第一个比当前元素a[i]大的元素,返回下标j, 然后更新 dp[j] = a;

到此,总体还是一个O(n*n)的算法,

但因为dp数组是单调的,可以用二分查找,使更新操作变成O(logn)

也可以从后向前查找dp数组,找到后用break;节省大概一半的时间,虽然是O(n^2),也可以A掉本题。。。

O(n*logn)代码:

 1 #include <stdio.h>
 2
 3  int n, a[43210], dp[43210];
 4  const int maxint = (1<<31)-1;
 5
 6  int bs(int l ,int r, int x)
 7  {
 8      int m;
 9      while(l < r)
10      {
11          m = (l + r)>>1;
12          if(dp[m] < x)
13          {
14              l = m + 1;
15          }
16          else
17          {
18              r = m;
19          }
20      }
21      return l;
22  }
23
24  int LIS()
25  {
26      int i, j, maxn = 1;
27      dp[0] = 0;
28      dp[1] = maxint;
29      for(i=1; i<=n; i++)
30      {
31          j = bs(0, maxn+1, a[i]);
32          dp[j] = a[i];
33          if(j > maxn)
34          {
35              maxn ++;
36              dp[maxn+1] = maxint;
37          }
38      }
39      return maxn;
40  }
41
42  int main()
43  {
44      int t, i;
45      scanf("%d", &t);
46      while(t-- && scanf("%d", &n))
47      {
48          for(i=1; i<=n && scanf("%d", a+i); i++);
49          printf("%d\n", LIS());
50      }
51      return 0;
52  }

转载于:https://www.cnblogs.com/yuan1991/archive/2012/12/06/pku1631.html

pku1631 Bridging signals相关推荐

  1. Bridging signals(二分 二分+stl dp)

    欢迎参加--每周六晚的BestCoder(有米!) Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 6 ...

  2. Bridging signals(最长上升子序列)

    Bridging signals 题目 "哦,不,他们又做到了",Waferland 芯片厂的首席设计师喊道.布线设计人员再次完全搞砸了,使连接两个功能块端口的芯片上的信号到处都是 ...

  3. HDU1950 Bridging signals 裸LIS

    Bridging signals Bridging signals 题意 代码 题意 HDU1950 裸LIS,信号不能交叉,编号1-N,实际上就是有序上升,趁5773复习了LIS,直接交了一发,基本 ...

  4. POJ 1634 Bridging signals

    Description 'Oh no, they've done it again', cries the chief designer at the Waferland chip factory. ...

  5. HDU 1950 Bridging signals

    那么一大篇的题目描述还真是吓人. 仔细一读其实就是一个LIS,还无任何变形. 刚刚学会了个二分优化的DP,1A无压力. 1 //#define LOCAL 2 #include <iostrea ...

  6. 最长连续子序列nlogn算法

    最长上升子序列(LIS)长度的O(nlogn)算法 标签: 算法search优化存储 2012-04-18 19:38 14031人阅读 评论(5) 收藏 举报  分类: 资料学习(15)  解题报告 ...

  7. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  8. 【转】别人整理的DP大全

    为什么80%的码农都做不了架构师?>>>    动态规划 动态规划 容易: 1018 , 1050 , 1083 , 1088 , 1125 , 1143 , 1157 , 1163 ...

  9. 最长上升子序列三种模板(n^2模板,二分模板,树状数组模板)

    最长上升子序列(LIS)是动态规划的入门.总结下来,经常用的模板一共有三种,分别为n^2模板,二分模板,树状数组模板. n^2模板代码如下: //n^2算法,本质就是dp,采用二重循环的方式.对于数据 ...

最新文章

  1. cytoscape插件bingo使用
  2. 杨校老师课堂之Java类与对象、封装、构造方法
  3. android 整数与ip地址的转换
  4. es6 --- Thunk函数的作用
  5. 腾讯云cloudlite认证_【腾讯云】考个证...大数据开发工程师认证
  6. 转:Kafka、RabbitMQ、RocketMQ等消息中间件的介绍和对比
  7. 一个连衣服都穿不整齐的人,代码也肯定写不整齐。
  8. 打开MSDTC的方法(图解)
  9. MSP430学习笔记1——msp430概述
  10. 程序员高考试卷泄密,检查一下你能答对多少题?
  11. Houdini粒子随机大小每帧变化问题
  12. druid安装与案例
  13. mysql数据库备份方式
  14. 计算机网络:路由的概念及其分类
  15. kafka中文教程(一)
  16. 沁恒MCU从EVT中提取文件建立MounRiver独立工程
  17. 被封杀4年的看片神器终于解禁了,要跟百度网盘抢生意?(末尾送书)
  18. [电脑网络]Verycd 维护中
  19. Ubuntu下Matlab复制粘贴失效
  20. 【翻译】和麻美学姐一起的世界树(マミさんと世界樹スレ)第八话后篇

热门文章

  1. Unity3D基础19:Tag标签
  2. 如何使用VS2012进行简单程序的DEBUG(入门级)
  3. 单纯型法Ⅱ(bzoj 1061: [Noi2008]志愿者招募)
  4. Latex除法a/b \frac{a}{b}
  5. MyBatis学习(十)--MyBatis数据操作
  6. 【Luogu】P2634聪聪可可(树形DP)
  7. BZOJ 3098: Hash Killer II(新生必做的水题)
  8. Compile、Make和Build的区别(as make, build, clean, run)
  9. dspic flash不够后,选择优化等级
  10. php单字母函数(快捷方法)使用总结转载