[dp]最长单调递增子序列LIS

https://www.51nod.com/tutorial/course.html#!courseId=12

解题关键:

如果将子序列按照长度由短到长排列,将他们的最大元素放在一起,形成新序列$B\left\{ {{b_1},{b_2}, \ldots  \ldots ,{b_j}} \right\}$,则序列$B$满足${b_1} < {b_2} <  \ldots  \ldots  < {b_j}$。这个关系比较容易说明,假设${b_{xy}}$表示序列A中长度为$x$的递增序列中的第$y$个元素,显然,如果在序列$B$中存在元素${b_{mm}} > {b_{nn}}$,且$m < n$则说明子序列${B_n}$的最大元素小于${B_m}$的最大元素,因为序列是严格递增的,所以在递增序列${B_n}$中存在元素${b_{nm}} < {b_{nn}}$,且从${b_{n0}}$到${b_{nm}}$形成了一个新的长度为$m$的递增序列,因为${b_{mm}} > {b_{nn}}$,所以${b_{mm}} > {b_{nm}}$,这就说明在序列$B$中还存在一个长度为$m$,最大元素为${b_{nm}} < {b_{mm}}$的递增子序列,这与序列的定义,${b_{mm}}$是所有长度为m的递增序列中第$m$个元素最小的序列不符,所以序列$B$中的各元素严格递增。

 

注意liss存的是下标,主要是为了求pre用,若只求max,你当然可以设成值。 

爆炸了,刚发现《挑战竞赛程序设计》上有一个代码非常非常简短的模板,炸了;

STL模板:

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring>  
 4 #include<algorithm>  
 5 #include<functional> 
 6 using namespace std;  
 7   
 8 const int N=131072;  
 9 int n=7, a[N] = {0,0,1,1,0,0,2};  
10 template<class Cmp>
11 int LIS (Cmp cmp){  
12     static int m=0,end[N];
13     for(int i=0;i<n;i++){  
14         int pos=lower_bound(end,end+m,a[i],cmp)-end;  
15         end[pos]=a[i],m+=pos==m;  
16     }  
17     return m;
18 } 
19 bool greater1(int value){  
20     return value>=1; 
21 }  
22   
23 int main(){
24     cout<<LIS(less<int>())<<endl;         //严格上升  
25     cout<<LIS(less_equal<int>())<<endl;   //非严格上升  
26     cout<<LIS(greater<int>())<<endl;      //严格下降  
27     cout<<LIS(greater_equal<int>())<<endl;//非严格下降  
28     cout<<count_if(a,a+7,greater1)<<endl; //计数  
29     //第二个参数为末尾元素的下一个位置  
30     return 0;  
31 }  

 

最终模板:

 1 #include<bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 using namespace std;
 4 typedef long long ll;
 5 ll a[50002],dp[50002];
 6 int main(){
 7     int n;
 8     cin>>n;
 9     for(int i=0;i<n;i++){
10         cin>>a[i];
11     }
12     fill(dp,dp+n,INF);
13     for(ll i=0;i<n;i++){
14         *lower_bound(dp,dp+n,a[i])=a[i];
15     }
16     printf("%lld\n",lower_bound(dp,dp+n,INF)-dp);
17 } 

 

自己改进模板(不带路径):注意二分时上界为len+1就ok了,也可以fill成inf,更简单明了

 1 #include<bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 using namespace std;
 4 typedef long long ll;
 5 int arr[50002],dp[50002];
 6 int n,len;
 7 int find1(int x){
 8     int mid,l=1,r=len+1;
 9     while(l<r){
10         mid=(l+r)>>1;
11         if(dp[mid]>x) r=mid;
12         else l=mid+1;
13     }
14     return r;
15 }
16 int lis(){
17     int dex;
18     for(int i=1;i<=n;i++){
19        dex=find1(arr[i]);
20         dp[dex]=arr[i];
21         len=max(len,dex);
22     }
23     return len;
24 }
25 int main(){
26     cin>>n;
27     for(int i=1;i<=n;i++){
28         cin>>arr[i];
29     }
30     ll ans=lis();
31     printf("%lld\n",ans);
32     return 0;
33 }

 

 

 

 带路径模板1

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<iostream>
 6 using namespace std;
 7 typedef long long ll;
 8 int a[50002],dp[50002],pre[50002],res[50002],n;
 9 int len;
10 
11 int find1(int x){
12     int mid,l=1,r=len+1;
13     while(l<r){
14         mid=(l+r)>>1;
15         if(a[dp[mid]]>x) r=mid;
16         else l=mid+1;
17     }
18     return r;
19 }
20 
21 int lis(){
22     len=0;
23     for(int i=1;i<=n;i++){
24         int dex=find1(a[i]);
25         dp[dex]=i;
26         if(dex!=1) pre[i]=dp[dex-1];
27         len=max(len,dex);
28     }
29     
30     int k=dp[len],t=len;
31     while(pre[k]!=k){
32         res[t--]=a[k];
33         k=pre[k];
34     }
35     res[t]=a[k];
36     return len;
37 }
38 int main(){
39     cin>>n;
40     for(int i=0;i<=n+2;i++)    pre[i]=i;
41     for(int i=1;i<=n;i++)    cin>>a[i];
42     
43     ll ans=lis();
44     printf("%lld\n",ans);
45     for(int i=1;i<=ans;i++){
46         printf("%d ",res[i]);
47     }
48     printf("\n");
49 }

 

 带路径模板2

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<iostream>
 6 using namespace std;
 7 typedef long long ll;
 8 int arr[50002],liss[50002],pre[50002],res[50002];
 9 int find1(int i,int l,int r){
10     int mid;
11     while(l<r){
12         mid=(l+r)>>1;
13         if(arr[liss[mid]]>arr[i]) r=mid;
14         else l=mid+1;
15     }
16     return r;
17 }
18 int lis(int len){
19     int max=1;
20     liss[0]=0;
21     for(int i=0;i<len;i++){
22         int index=find1(i,0, max-1);
23         if(index==0&&arr[liss[index]]>=arr[i]){
24             liss[index]=i;
25             continue;
26         }//增加这条语句主要是pre的影响,不需要路径的话,完全可以去掉。
27         if(index==max-1&&arr[liss[index]]<arr[i]){
28             liss[max++]=i;
29             pre[i]=liss[index];
30             continue;
31         }
32         liss[index]=i;
33         pre[i]=liss[index-1];
34     }
35     
36     int k=liss[max-1],t=max-1;
37     while(pre[k]!=k){
38         res[t--]=arr[k];
39         k=pre[k];
40     }
41     res[t]=arr[k];
42     return max;
43 }
44 int main(){
45     int n;
46     cin>>n;
47     for(int i=0;i<n+2;i++){
48         pre[i]=i;
49     }
50     for(int i=0;i<n;i++){
51         cin>>arr[i];
52     }
53     ll ans=lis(n);
54     printf("%lld\n",ans);
55     for(int i=0;i<ans;i++){
56         printf("%d ",res[i]);
57     }
58     printf("\n");
59 }

 

转载于:https://www.cnblogs.com/elpsycongroo/p/6847444.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jQuery中的元素操作

jQuery元素操作 通过jQuery可以操作控制元素的样式,文本,属性等 jquery样式操作 css操作行内样式 // 获取div的样式 $("div").css("width"); $("div").css("color");//设置div的样式 $("div").css("width",&q…

指针结构体函数-事实上能够这样具体理解

今天一大早登了下QQ空间&#xff0c;看到本科的一个学弟发表一篇日志。写关于西电微软俱乐部面试题的解答&#xff0c;写的非常不 错。我也一下子起兴了&#xff0c;由于我以前也是被指针困惑非常久。搞不清头绪&#xff0c;本科到研究生。我也笔试面试不下二十次 了。每次面试…

【python毕业设计】Django框架实现学生信息管理系统

Django框架实现学生信息管理系统 演示视频&#xff1a;Django学生信息管理系统_腾讯视频 演示界面内容如下 总体概括 注册流程 首先进行输入用户名&#xff08;邮箱&#xff09;、密码以及验证码&#xff0c;输入完之后点击注册按钮。如果输入的不正确&#xff0c;提示错误信…

python中continue只结束本次循环_循环(while,break,continue),转义字符

Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 >01. 程序的三大流程 在程序开发中&#xff0c;一共有三种流程方式&#xff1a; 顺序 —— 从上向下&#xff0c;顺序执行代码 分支 —— 根据条件判断&#xff0c;决定执行代码的 分支 …

码率控制技术原理

引起编码器的输出比特码率波动的原因主要有两个。首先&#xff0c;数字视频信号中包含了大量的时域和空域冗余&#xff0c;编码器的主要任务就是去除这些冗余。由于时间冗余和空间冗余是随机的&#xff0c;从而造成编码器输出比特率波动。另一个原因是变长编码&#xff0c;变长…

python如何安装pip

pip的安装操作 pip简介 pip 是一个现代的&#xff0c;通用的 Python 包管理工具。提供了对Python 包的查找、下载、安装、卸载的功能。 环境搭建 安装pip首先要安装python,可以参考python安装教程 安装完python后,可以在cmd中输入pip list 测试一下pip是否默认附带着安装,若…

【排序算法】python 十大经典排序算法(全网最详)

排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。常见的内部排序算法有&#xff1a;插入排序、希尔排序、选择排序…

最新海康摄像机、NVR、流媒体服务器、回放取流RTSP地址规则说明

本文档主要介绍海康威视设备预览、回放、流媒体取流的RTSP URL和IE直接预览、回放的HTTP URL。RTSP为取流协议&#xff0c;取到码流后需要解码显示&#xff0c;可以通过VLC播放器进行测试&#xff0c;IE等浏览器网页不支持RTSP协议直接取流预览或者回放。网页上需要跳过登录界面…

pug模板引擎(原jade)

前面的话 为什么要引入pug&#xff0c;pug有什么特别之处呢&#xff1f;有一些嵌套层次较深的页面&#xff0c;可能会出现巢状嵌套&#xff0c;如下图所示 在后期维护和修改时&#xff0c;一不小心少了一个尖括号&#xff0c;或者某个标签的开始和闭合没有对应上&#xff0c;就…

python安装环境傻瓜式安装_前后端分离——前端开发环境傻瓜式一步到位 nodejs ruby python nginx 安装搭建配置...

前端开发环境一步到位 一、准备工作 nodejs安装 安装&#xff1a;next->next.... Ruby安装 安装&#xff1a;next->next.... 需要配置到path&#xff1a;将安装目录复制到环境变量中&#xff0c;跟jdk环境变量配置一样。 注意下一步&#xff1a;Python安装 安装&#xff…

【Python】Python学到什么程度可以面试工作?------持续更新 ...

前言&#xff1a; 从事python学习&#xff0c;有爬虫、web后台、深度学习相关经验&#xff0c; 坐标北京欢迎骚扰。 本答案力求简洁和直击重点&#xff0c;代码部分使用Python3&#xff0c;更详细的解释请Google&#xff0c;回答有误请务必提醒答主&#xff0c;我将及时改正。…

H.264的码率控制算法

H&#xff0e;264的码率控制算法采用了多种技术&#xff0c;其中包括自适应基本单元层(Adaptive Basic Unit Layer)、流量往返模型(Fluid Traffic Model)、线性MAD模型、二次率失真模型等。并且采用了分层码率控制策略&#xff0c;共分为三层&#xff1a;GOP层、帧层和基本单元…

消息中间件Client模块划分

上图是之间讨论确定的系统架构&#xff08;后续内容会按照这个架构来叙述&#xff09;&#xff0c;其中&#xff1a; 客户端包含Producer和Consumer两大块 客户端需要和NameServer交互来获取元数据 客户端需要和Broker交互来读写消息 Client模块划分 1. 网络模块 第一个仍然是…

详解HashMap数据结构实现

HashMap的设计是由数组加链表的符合数据结构&#xff0c;在这里用自己的语言以及结合源码去总结一下&#xff0c;如果有不对的地方希望评论指正&#xff0c;先拱手谢谢。 HashMap是日常中非常常用的一种数据结构&#xff0c;我们要想深入了解学习任何一门技术&#xff0c;都是要…

java web开发学习手册_Java 人必备学习手册开发下载!

今天给大家分享一套 5000 页的 Java 学习手册&#xff0c;新鲜出炉&#xff01;此手册内容专注 Java技术&#xff0c;包括 JavaWeb&#xff0c;SSM&#xff0c;Linux&#xff0c;Spring Boot&#xff0c;MyBatis&#xff0c;MySQL&#xff0c;Nginx&#xff0c;Git&#xff0c;…

Django初次体验

Django初次体验 关于django的安装&#xff0c;宝宝们可以参考django简介以及安装 Django框架的搭建 在终端中进入需要建立项目的目录 执行&#xff1a; django-admin startproject mysite其中&#xff0c;mysite是项目目录名&#xff0c;可以自定义 我们来看看startprojec…

【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】...

【002-Add Two Numbers (单链表表示的两个数相加)】 原题 You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked…

关键帧 关于decode_one_frame函数

田克平(94338047) 16:57:34能自己设置某帧为关键帧吗&#xff1f; 抱柱者(86311414) 16:57:59to 田克平可以 田克平(94338047) 17:00:00呵呵&#xff0c;把丢包后的下一帧设置为I帧可以吗&#xff1f;来处理丢帧现象 ☆雪天/kf☆(279373002) 17:00:42这个难度大了 田克平(94338…

不出现php version网页_php冷知识 - 从命令行参数列表中获取选项

分享一个php的冷知识 - &#xff0c;从命令行参数列表中获取选项用到的函数是getopt 说明函数签名是这样的getopt ( string $options [, array $longopts [, int &$optind ]] ) : array|bool false解析传入脚本的选项&#xff0c;成功返回数组&#xff0c;解析失败返回fals…

【机器学习】opencv-摄像头中的人脸采集

本次在视频识别的程度上增添了摄像头实时识别&#xff0c; 区别在于&#xff1a; # v cv2.VideoCapture(./dzd2.mp4) v cv2.VideoCapture(0) import numpy as npimport cv2face_detector cv2.CascadeClassifier(./haarcascade_frontalface_alt2.xml) # v cv2.VideoCapt…