pku1631 Bridging signals
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相关推荐
- Bridging signals(二分 二分+stl dp)
欢迎参加--每周六晚的BestCoder(有米!) Bridging signals Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 6 ...
- Bridging signals(最长上升子序列)
Bridging signals 题目 "哦,不,他们又做到了",Waferland 芯片厂的首席设计师喊道.布线设计人员再次完全搞砸了,使连接两个功能块端口的芯片上的信号到处都是 ...
- HDU1950 Bridging signals 裸LIS
Bridging signals Bridging signals 题意 代码 题意 HDU1950 裸LIS,信号不能交叉,编号1-N,实际上就是有序上升,趁5773复习了LIS,直接交了一发,基本 ...
- POJ 1634 Bridging signals
Description 'Oh no, they've done it again', cries the chief designer at the Waferland chip factory. ...
- HDU 1950 Bridging signals
那么一大篇的题目描述还真是吓人. 仔细一读其实就是一个LIS,还无任何变形. 刚刚学会了个二分优化的DP,1A无压力. 1 //#define LOCAL 2 #include <iostrea ...
- 最长连续子序列nlogn算法
最长上升子序列(LIS)长度的O(nlogn)算法 标签: 算法search优化存储 2012-04-18 19:38 14031人阅读 评论(5) 收藏 举报 分类: 资料学习(15) 解题报告 ...
- 《挑战程序设计竞赛(第2版)》习题册攻略
本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...
- 【转】别人整理的DP大全
为什么80%的码农都做不了架构师?>>> 动态规划 动态规划 容易: 1018 , 1050 , 1083 , 1088 , 1125 , 1143 , 1157 , 1163 ...
- 最长上升子序列三种模板(n^2模板,二分模板,树状数组模板)
最长上升子序列(LIS)是动态规划的入门.总结下来,经常用的模板一共有三种,分别为n^2模板,二分模板,树状数组模板. n^2模板代码如下: //n^2算法,本质就是dp,采用二重循环的方式.对于数据 ...
最新文章
- cytoscape插件bingo使用
- 杨校老师课堂之Java类与对象、封装、构造方法
- android 整数与ip地址的转换
- es6 --- Thunk函数的作用
- 腾讯云cloudlite认证_【腾讯云】考个证...大数据开发工程师认证
- 转:Kafka、RabbitMQ、RocketMQ等消息中间件的介绍和对比
- 一个连衣服都穿不整齐的人,代码也肯定写不整齐。
- 打开MSDTC的方法(图解)
- MSP430学习笔记1——msp430概述
- 程序员高考试卷泄密,检查一下你能答对多少题?
- Houdini粒子随机大小每帧变化问题
- druid安装与案例
- mysql数据库备份方式
- 计算机网络:路由的概念及其分类
- kafka中文教程(一)
- 沁恒MCU从EVT中提取文件建立MounRiver独立工程
- 被封杀4年的看片神器终于解禁了,要跟百度网盘抢生意?(末尾送书)
- [电脑网络]Verycd 维护中
- Ubuntu下Matlab复制粘贴失效
- 【翻译】和麻美学姐一起的世界树(マミさんと世界樹スレ)第八话后篇
热门文章
- Unity3D基础19:Tag标签
- 如何使用VS2012进行简单程序的DEBUG(入门级)
- 单纯型法Ⅱ(bzoj 1061: [Noi2008]志愿者招募)
- Latex除法a/b \frac{a}{b}
- MyBatis学习(十)--MyBatis数据操作
- 【Luogu】P2634聪聪可可(树形DP)
- BZOJ 3098: Hash Killer II(新生必做的水题)
- Compile、Make和Build的区别(as make, build, clean, run)
- dspic flash不够后,选择优化等级
- php单字母函数(快捷方法)使用总结转载