题意:一个含有n个元素的数组,删去k个连续数后,最长上升子序列        /*思路参考GoZy

思路: 4 2 3 [5 7 8] 9 11 ,括号表示要删掉的数,

所以  最长上升子序列  =   ] 右边数A的lis + [左边最大值小于A的lis

即相当于枚举删除的所有情况,并求它们的LIS,取最大值

如本例 : 最长 = 2[ 9 11]  + 2[2 3],  然后将框从左往右移,算出最大值

用nlog(n)求LIS:

对于a[i],在arr数组中用log(n)找到比它小的数的个数x,arr[x] = a[i] ,arr保存的到当前位置的最长LIS

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
#include <vector>
#include <queue>
#define MAXN 100010
typedef long long ll;
using namespace std; const int N = 1e5 + 5;
int a[N];
int b[N];
int d1[N]; //表示i处的LIS
int arr[N]; int main()
{
int t,cas = 1;
int n,len;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&len);
for(int i = 0; i <= n-1; i++)
{
scanf("%d",&a[i]);
b[i] = -a[i]; //为求右边的LIS
} memset(arr,0x3f3f3f,sizeof(arr));
for(int i = n-1; i >= 0; i--) //nlog(n)求LIS
{
int x = lower_bound(arr,arr+n,b[i]) - arr; //用log(n)查找,也可二分
arr[x] = b[i];
d1[i] = x+1;
} int ans = 0,tlen = 0;
memset(arr,0x3f3f3f,sizeof(arr));
for(int i = len; i < n; i++) //arr中保存框左边的数最长lis
{
int x = lower_bound(arr,arr+n,a[i]) - arr; //在前面找最大值比a[i]小的最长LIS
ans = max(ans,x + d1[i]);
x = lower_bound(arr,arr+n,a[i - len]) - arr;
arr[x] = a[i - len];
tlen = max(x+1,tlen); //记录左边的最长长度
}
printf("Case #%d: ", cas++);
ans = max(ans,tlen); //比较全在框左边的情况
printf("%d\n",ans);
}
return 0;
}

  

ps.如果没有东西值得你为之努力,那你和一条咸鱼有什么区别?

hdu 5489(LIS最长上升子序列)的更多相关文章

  1. hdu 5256 序列变换(LIS最长上升子序列)

    Problem Description 我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元素都必须是整数. 请输出最少需要修改多 ...

  2. 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...

  3. POJ - 3903 Stock Exchange(LIS最长上升子序列问题)

    E - LIS Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u   Descripti ...

  4. POJ 3903 Stock Exchange (E - LIS 最长上升子序列)

    POJ 3903    Stock Exchange  (E - LIS 最长上升子序列) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action ...

  5. 动态规划模板1|LIS最长上升子序列

    LIS最长上升子序列 dp[i]保存的是当前到下标为止的最长上升子序列的长度. 模板代码: int dp[MAX_N], a[MAX_N], n; int ans = 0; // 保存最大值 for ...

  6. POJ 1887 Testingthe CATCHER (LIS:最长下降子序列)

    POJ 1887Testingthe CATCHER (LIS:最长下降子序列) http://poj.org/problem?id=3903 题意: 给你一个长度为n (n<=200000) ...

  7. hdu 5748(求解最长上升子序列的两种O(nlogn)姿势)

    Bellovin Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepte ...

  8. LIS最长上升子序列O(n^2)与O(nlogn)的算法

    动态规划 最长上升子序列问题(LIS).给定n个整数,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他数的顺序不变).例如序列1, 6, 2, 3, 7, ...

  9. LIS 最长递增子序列

    一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...

随机推荐

  1. Java Client/Server 基础知识

    Java的网络类库支持多种Internet协议,包括Telnet, FTP 和HTTP (WWW),与此相对应的Java网络类库的子类库为: Java.net  Java.net.ftp  Java. ...

  2. 基本数据类型 Symbol

    ES6 规范之前, JavaScript 一共有六种数据类型,分别是五种基本数据类型: string . number , boolean , null , undefined ,和一种引用数据类型: ...

  3. HTML事件处理程序

    事件处理程序中的代码执行时,有权访问全局作用域中任何代码. //为按钮btn_event添加了两个个事件处理程序,而且该事件会在冒泡阶段触发(最后一个参数是false). var btn_event ...

  4. python安装及写一个简单的验证码组件(配合node)

    1.安装Python 到官网下载响应系统的版本(这里以windows为例):https://www.python.org/downloads/windows/ 然后就是不断地"下一步&quo ...

  5. 关于 Form 表单的 enctype 属性

    enctype 属性一共有3个值 application/x-www-form-urlencoded 在发送前编码所有字符(默认) multipart/form-data 上传二进制数据, 所以在使用 ...

  6. 创建帧动画1 - xml方式

    废话不多说,先看东西   创建帧动画1 - xml方式 帧动画的创建方式主要以下2种: * 用xml创建动画: * 用代码创建动画:   本文内容主要关注 xml文件 创建帧动画的方式   xml文件 ...

  7. Python内置函数(51)——hasattr

    英文文档: hasattr(object, name) The arguments are an object and a string. The result is True if the stri ...

  8. 使用Putty实现windows向阿里云的Linux云服务器上传文件

    1.首先获取PSCP工具 PuTTY小巧方便.但若需要向网络中的Linux系统上传文件,则可以使用PuTTY官方提供的PSCP工具来实现上传.PSCP是基于ssh协议实现. 可以点击这里下载 2.启动 ...

  9. tomcat 修改默认字符集

    找到connector节点,插入 disableUploadTimeout="true" useBodyEncodingForURI="true" URIEnc ...

  10. tar磁带归档

    一:压缩.解压 1.compress/uncompress/zcat -d:解压 -c:输出到终端,不删除原文件 -v:显示详细信息 2.gzip/ungzip/zcat -d:解压 -c:将压缩或解 ...