求最长上升子序列长度:

单纯的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的更多相关文章

  1. hdu 1025LIS思路同1257 二分求LIS

    题目: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  2. HDU 5773 The All-purpose Zero(O(nlgn)求LIS)

    http://acm.hdu.edu.cn/showproblem.php?pid=5773 题意: 求LIS,其中的0可以看做任何数. 思路: 因为0可以看做任何数,所以我们可以先不管0,先求一遍L ...

  3. HDU 5773:The All-purpose Zero(贪心+LIS)

    http://acm.hdu.edu.cn/showproblem.php?pid=5773 The All-purpose Zero Problem Description   ?? gets an ...

  4. HDU 5773 The All-purpose Zero 脑洞LIS

    给定一个序列,里面的0是可以任变的.问变化后最长的LIS的长度 首先,0全部选上是不亏的.这个不知道怎么说,YY一下吧. 最关键的就是解决2 0 0 3 这种问题了. 注意到这个序列的LIS应该是3 ...

  5. hdu 5773 The All-purpose Zero 最长上升子序列+树状数组

    题目链接:hdu 5773 The All-purpose Zero 官方题解:0可以转化成任意整数,包括负数,显然求LIS时尽量把0都放进去必定是正确的. 因此我们可以把0拿出来,对剩下的做O(nl ...

  6. hdu 1950 最长上升子序列(lis) nlogn算法【dp】

    这个博客说的已经很好了.http://blog.csdn.net/shuangde800/article/details/7474903 简单记录一下自己学的: 问题就是求一个数列最长上升子序列的长度 ...

  7. Codeforces 486E LIS of Sequence --树状数组求LIS

    题意: 一个序列可能有多个最长子序列,现在问每个元素是以下三个种类的哪一类: 1.不属于任何一个最长子序列 2.属于其中某些但不是全部最长子序列 3.属于全部最长子序列 解法: 我们先求出dp1[i] ...

  8. HDU 5773 The All-purpose Zero

    这题想了1个多小时想不出来...方法真是精妙... 官方题解:0可以转化成任意整数,包括负数,显然求LIS时尽量把0都放进去必定是正确的.因此我们可以把0拿出来,对剩下 的做O(nlogn)的LIS, ...

  9. hdu5256 二分求LIS+思维

    解题的思路很巧,为了让每个数之间都留出对应的上升空间,使a[i]=a[i]-i,然后再求LIS 另外二分求LIS是比较快的 #include<bits/stdc++.h> #define ...

  10. poj1631——树状数组求LIS

    题目:http://poj.org/problem?id=1631 求LIS即可,我使用了树状数组. 代码如下: #include<iostream> #include<cstdio ...

随机推荐

  1. CSS3关于transition过渡

    第一次写博客,心里竟然有点感动,注册了两个月了,一直不敢写,总觉得这应该是大神交流的地方.今天写的一个css3的一个导航,觉得挺好看,放在网页里,也可以起到一个点睛之笔的作用. 首先写好body标签中 ...

  2. Spring的DI(Ioc) - 利用构造器注入

    1: 在给对象提供构造器 public class PersonServiceImpl implements PersonService { private PersonDao personDao; ...

  3. [转载] 构建微服务:使用API Gateway

    原文: http://mp.weixin.qq.com/s?__biz=MzA5OTAyNzQ2OA==&mid=206889381&idx=1&sn=478ccb35294c ...

  4. 2014 Multi-University Training Contest 4

    1006 hdu4902 #include <iostream> #include<stdio.h> #include<vector> #include<qu ...

  5. spring 好处与优点

    使用Spring有什么好处?(1)Spring能有效地组织你的中间层对象.(2)Spring能消除在许多工程中常见的对Singleton的过多使用.(3)Spring能消除各种各样自定义格式的属性文件 ...

  6. Memcache的安装

    下载安装包: wget http://www.memcached.org/files/memcached-1.4.32.tar.gz wget https://cloud.github.com/dow ...

  7. Hostapd

    Hostapd 一.基本概念 hostapd is an application used to setup your wireless interface as an access-point (m ...

  8. Oracle 遇到的错误及处理整理 - 记录

    1. 启动监听提示: TNS-: TNS:permission denied TNS-: TNS:protocol adapter error TNS-: Insufficient privilege ...

  9. hdu5787(数位dp)

    基础的数位dp,才发现今天才终于彻底搞懂了数位dp... // // main.cpp // hdu5787.1 // // Created by New_Life on 16/8/10. // Co ...

  10. js跨域问题的解决

    js提交请求给别的应用实例或者别的服务器,由于同源策略,存在js跨域的情况,我所知道两种处理方式: 1.jquery ajax+jsonp <script type="text/jav ...