HDU 5773 The All-purpose Zero 求LIS
求最长上升子序列长度:
单纯的dp时间复杂度是O(n*n)的
dp[i] = max(dp[j]+1); (0=<j<=i-1 && a[i]>a[j])
用二分可以减少查找的时间:时间复杂度:O(n*log(n))
模板:
#define maxn 100010
int a[maxn], b[maxn]; // 二分在b[] 数组里找第一个比num 大的数的位置。
int search_(int num, int low, int high) {
int mid;
while(low <= high) {
mid = (low+high)/2;
if (num >= b[mid]) low = mid + 1;
else high = mid - 1;
}
return low;
} int LIS(int n) {
int i, len, pos;
b[1] = a[1];
len = 1;
for (i=2; i<=n; ++i) {
if (a[i] > b[len]) {// 如果a[i]比b[]中最大的数还大直接插入到最后。 //如果是非递减序列,改为 >= 即可。
len = len + 1;
b[len] = a[i];
}
else {
pos = search_(a[i], 1, len);
b[pos] = a[i];
}
}
return len;
}
Eg:题目链接:The All-purpose Zero
题意:给一个序列,序列里的0可以代替任何数,问这个序列里最长递增子序列的长度。0也可以代替负数。(如果不可以的话...)
思路:因为0可以代替任何数,所以ans一定是优先选择0的,然后把每个数减掉它前面的0的个数。为什么减0呢... 比如:1 2 0 3 优先选0,3-1=2,... ,这样就变成了1 2 2 ...求最长上升子序列的长度+0的个数。
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std; #define maxn 100010
int a[maxn], b[maxn]; // 二分在b[] 数组里找第一个比num 大的数的位置。
int search_(int num, int low, int high) {
int mid;
while(low <= high) {
mid = (low+high)/2;
if (num >= b[mid]) low = mid + 1;
else high = mid - 1;
}
return low;
} int LIS(int n) {
int i, len, pos;
b[1] = a[1];
len = 1;
for (i=2; i<=n; ++i) {
if (a[i] > b[len]) {// 如果a[i]比b[]中最大的数还大直接插入到最后。 //如果是非递减序列,改为 >= 即可。
len = len + 1;
b[len] = a[i];
}
else {
pos = search_(a[i], 1, len);
b[pos] = a[i];
}
}
return len;
} int main() {
//freopen("in.cpp", "r", stdin);
int t;
scanf("%d", &t);
int cas = 0;
while(t--) {
int n;
scanf("%d", &n);
int zeroNum = 0, cnt = 0;
for (int i=0; i<n; ++i) {
int temp;
scanf("%d", &temp);
if (temp == 0) zeroNum++;
else {
temp -= zeroNum;
a[++cnt] = temp;
}
}
int ans = LIS(cnt) + zeroNum;
if (cnt == 0) ans -= 1;
printf("Case #%d: %d\n", ++cas, ans);
}
return 0;
}
HDU 5773 The All-purpose Zero 求LIS的更多相关文章
- hdu 1025LIS思路同1257 二分求LIS
题目: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- HDU 5773 The All-purpose Zero(O(nlgn)求LIS)
http://acm.hdu.edu.cn/showproblem.php?pid=5773 题意: 求LIS,其中的0可以看做任何数. 思路: 因为0可以看做任何数,所以我们可以先不管0,先求一遍L ...
- HDU 5773:The All-purpose Zero(贪心+LIS)
http://acm.hdu.edu.cn/showproblem.php?pid=5773 The All-purpose Zero Problem Description ?? gets an ...
- HDU 5773 The All-purpose Zero 脑洞LIS
给定一个序列,里面的0是可以任变的.问变化后最长的LIS的长度 首先,0全部选上是不亏的.这个不知道怎么说,YY一下吧. 最关键的就是解决2 0 0 3 这种问题了. 注意到这个序列的LIS应该是3 ...
- hdu 5773 The All-purpose Zero 最长上升子序列+树状数组
题目链接:hdu 5773 The All-purpose Zero 官方题解:0可以转化成任意整数,包括负数,显然求LIS时尽量把0都放进去必定是正确的. 因此我们可以把0拿出来,对剩下的做O(nl ...
- hdu 1950 最长上升子序列(lis) nlogn算法【dp】
这个博客说的已经很好了.http://blog.csdn.net/shuangde800/article/details/7474903 简单记录一下自己学的: 问题就是求一个数列最长上升子序列的长度 ...
- Codeforces 486E LIS of Sequence --树状数组求LIS
题意: 一个序列可能有多个最长子序列,现在问每个元素是以下三个种类的哪一类: 1.不属于任何一个最长子序列 2.属于其中某些但不是全部最长子序列 3.属于全部最长子序列 解法: 我们先求出dp1[i] ...
- HDU 5773 The All-purpose Zero
这题想了1个多小时想不出来...方法真是精妙... 官方题解:0可以转化成任意整数,包括负数,显然求LIS时尽量把0都放进去必定是正确的.因此我们可以把0拿出来,对剩下 的做O(nlogn)的LIS, ...
- hdu5256 二分求LIS+思维
解题的思路很巧,为了让每个数之间都留出对应的上升空间,使a[i]=a[i]-i,然后再求LIS 另外二分求LIS是比较快的 #include<bits/stdc++.h> #define ...
- poj1631——树状数组求LIS
题目:http://poj.org/problem?id=1631 求LIS即可,我使用了树状数组. 代码如下: #include<iostream> #include<cstdio ...
随机推荐
- 如何在VirtualBox虚拟机软件上安装Win7虚拟系统
在Windows系统中安装VirtualBox 双击从官网上下载的VirtualBox-4.3.12-93733-Win.exe安装程序,默认下一步,下一步完成基础安装. 在VirtualBox虚拟机 ...
- sql for xml 嵌套
找很久.原来差一个ELEMENTS 关键字. 想到哪里插入子节点.就直接写一条语句,加一个ELEMENTS. 为什么baidu这么就都找不到.到处都是转来转去的东西.郁闷. select h.*,(s ...
- SAP接口编程 之 JCo3.0系列(05) : Exception Handling
JCO3.0的Exception,常用的Exception如下: JCoException 继承自java.lang.Exception,是JCo3中Exception的基类. JCoRuntimeE ...
- 纯css3样式属性制作各种图形图标
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C++——并发编程
一.高级接口:async()和Future 1.1 async()和Future的第一个用例 假设需要计算两个操作数的总和,而这两个操作数是两个函数的返回值.寻常加法如下: func1() + fun ...
- 【Linux日志】系统日志及分析
Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息. 大部分Linux发行版默认的日志守护进程为 syslog,位于 /etc/syslog 或 / ...
- MyBatis学习笔记(四) 注解
使用MyBatis注解开发,可以省去类配置文件,简洁方便.但是比较复杂的SQL和动态SQL还是建议书写类配置文件. 注解还是不推荐使用的.只是了解了解!简单的CRUD可以使用注解.简单写写. ...
- 关于e820cycles参数
关于e820cycles参数http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=327458&pid= ...
- mac 下 parallels 虚拟机 ubuntuServer 安装 parallels tools
mac 下 parallels 虚拟机 ubuntuServer 安装 parallels tools 1. 先点击ubuntu 虚拟机右下角的设置 -----安装 parallels tools - ...
- js上下滚屏效果,代码通过测试
这是html代码 <div class="box"> <div class="bcon"> <h1><b>领号实 ...