线性DP LIS浅谈
LIS问题
什么是LIS?
百度百科
最长上升子序列(Longest Increasing Subsequence,LIS),在计算机科学上是指一个序列中最长的单调递增的子序列。
怎么求LIS?
O(n^2)做法
具体做法是用两个for,状态转移方程为f[i]=max(f[i],f[j]+1)其中f数组为这个位置的LIS长度,然后用max找一下最长LIS即可
代码
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
if(a[j]<a[i])
f[i]=max(f[i],f[j]+1);
for(int i=1;i<=n;i++)
ans2=max(ans2,f[i]);
其中也可以取等号
O(nlogn)做法
具体做法是用数组去维护LIS,然后如果遇到比他小的二分数组
代码
if(u[ans2]<a[i])
u[++ans2]=a[i];
else
u[lower_bound(u+1,u+ans2+1,a[i])-u]=a[i];
拓展定理(Dilworth定理)
什么是Dilworth定理?
百度百科
反链是一种偏序集,其任意两个元素不可比;而链则是一种任意两个元素可比的偏序集。Dilworth定理说明,存在一个反链A与一个将序列划分为链族P的划分,使得划分中链的数量等于集合A的基数。当存在这种情况时,对任何至多能包含来自P中每一个成员一个元#### 素的反链,A一定是此序列中的最大反链。同样地,对于任何最少包含A中的每一个元素的一个链的划分,P也一定是序列可以划分出的最小链族。偏序集的宽度被定义为A与P的共同大小。
另一种Dilworth定理的等价表述是:在有穷偏序集中,任何反链最大元素数目等于任何将集合到链的划分中链的最小数目。一个关于无限偏序集的理论指出,在此种情况下,一个偏序集具有有限的宽度w,当且仅当它可以划分为最少w条链。
对于LIS的用途
求LIS的个数就是求最长下降子序列的长度,注意其中的<之类的符号是取补集的,也就是说如果上面用的>那么反面就是<=
完整代码(洛谷模板题 P1020 导弹拦截)
O(nlogn)算法
#include <bits/stdc++.h>
using namespace std;
int a[100005],u[100005],l[100005];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n=1;
while(cin>>a[n]) n++;
n--;
int ans1=1,ans2=1;
l[1]=u[1]=a[1];
for(int i=2;i<=n;i++)
{
if(l[ans1]>=a[i])
l[++ans1]=a[i];
else
l[upper_bound(l+1,l+ans1+1,a[i],cmp)-l]=a[i];
if(u[ans2]<a[i])
u[++ans2]=a[i];
else
u[lower_bound(u+1,u+ans2+1,a[i])-u]=a[i];
}
cout<<ans1<<" "<<ans2;
}
O(n^2)算法
#include <bits/stdc++.h>
using namespace std;
int a[100010];
int f[100010];
int main()
{
int n=1;
while(cin>>a[n])
f[n++]=1;
n--;
int ans1,ans2;
ans1=ans2=-1;
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
if(a[j]>=a[i])
f[i]=max(f[i],f[j]+1);
for(int i=1;i<=n;i++)
ans1=max(ans1,f[i]);
for(int i=1;i<=n;i++)
f[i]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
if(a[j]<a[i])
f[i]=max(f[i],f[j]+1);
for(int i=1;i<=n;i++)
ans2=max(ans2,f[i]);
cout<<ans1<<" "<<ans2;
}
线性DP LIS浅谈的更多相关文章
- (线性DP LIS)POJ2533 Longest Ordered Subsequence
Longest Ordered Subsequence Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 66763 Acc ...
- 数位dp真·浅谈 By cellur925
预警:由于是从$Vergil$学长那里和$Mathison$大神那里学来的,所以清一色记忆化搜索!qwq 巨佬的数位dp讲解(未来的咕咕日报头条): https://www.luogu.org/blo ...
- 线性DP总结(studying
写在前面 虽然都说线性DP是入门,但我还是今天才开始学 线性DP就是珂以通过线性处理得出答案的一种DP 每一种状态都可以从前面推得,并且推导过程是呈线性的 参考题单(本人现在主要用luogu,所以这些 ...
- 浅谈期望的线性性(可加性)【CodeForces280c】【bzoj3036】【bzoj3143】
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63399955 向大(hei)佬(e)势力学(di ...
- 线性DP总结(LIS,LCS,LCIS,最长子段和)
做了一段时间的线性dp的题目是时候做一个总结 线性动态规划无非就是在一个数组上搞嘛, 首先看一个最简单的问题: 一,最长字段和 下面为状态转移方程 for(int i=2;i<=n;i++) { ...
- 浅谈状态压缩DP
浅谈状态压缩DP 本篇随笔简单讲解一下信息学奥林匹克竞赛中的状态压缩动态规划相关知识点.在算法竞赛中,状压\(DP\)是非常常见的动规类型.不仅如此,不仅是状压\(DP\),状压还是很多其他题目的处理 ...
- 1. 线性DP 300. 最长上升子序列 (LIS)
最经典单串: 300. 最长上升子序列 (LIS) https://leetcode-cn.com/problems/longest-increasing-subsequence/submission ...
- 浅谈Java中set.map.List的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
随机推荐
- [Android6.0][RK3399] 双屏异显代码实现流程分析(一)【转】
本文转载自:http://blog.csdn.net/dearsq/article/details/55049182 Platform: RK3399 OS: Android 6.0 Version: ...
- 谷歌浏览器(Chrome)查看http报文headers信息
转自:https://blog.csdn.net/floatdreamed/article/details/79208719 ①打开谷歌浏览器,随意输入要搜索的内容 ②按下F12键,此时会弹出浏览器的 ...
- DNS中的AC、rndc、智能DNS解析和基础排错
bind中的ACL和rndc DNS除了服务器外,还具有一些访问控制和视图功能. 访问控制是指仅对定义的网络进行解析,视图也就是智能解析. 1>访问控制是通过acl函数来实现的,acl把一个或多 ...
- 清北考前刷题day3下午好
/* 可以并查集维护 可以发现,某个联通快出现大于等于2个环,一定无法分配. 有解要么一个环,要么没有环. 一个环时答案等于点数乘2(顺时针或逆时针). 没有环是树,对于一个n个点的树,方案一定有n种 ...
- 小记 vue 打包(build)需要注意的一些事
记录 vue 项目打包的一些事情 首先声明项目都是由 vue-cli 生成; vue 项目从 dev 切换到 prod 时有很多地方需要注意; 首先是大家最需要注意的 ajax 切换环节 以前一开始用 ...
- [TJOI2012]桥
Description 有n个岛屿,m座桥,每座桥连通两座岛屿,桥上会有一些敌人,玩家只有消灭了桥上的敌人才能通过,与此同时桥上的敌人会对玩家造成一定伤害.而且会有一个大Boss镇守一座桥,以玩家目前 ...
- Hdu 4612 Warm up (双连通分支+树的直径)
题目链接: Hdu 4612 Warm up 题目描述: 给一个无向连通图,问加上一条边后,桥的数目最少会有几个? 解题思路: 题目描述很清楚,题目也很裸,就是一眼看穿怎么做的,先求出来双连通分量,然 ...
- 同余模定理 HDOJ 5373 The shortest problem
题目传送门 /* 题意:题目讲的很清楚:When n=123 and t=3 then we can get 123->1236->123612->12361215.要求t次操作后, ...
- Android内存管理(15)SparseArray系列代替HashMap系列
参考: https://liuzhichao.com/p/832.html http://www.2cto.com/kf/201311/255640.html 1,简介: SparseArray是an ...
- 笔记本 windows 10 安装
开机按快捷键是F12,选择从usb启动.秋叶系统 很好用,推荐使用. 联想笔记本u深度一键u盘启动BIOS设置教程:准备工作:制作好u深度u盘启动盘http://rj.baidu.com/soft/d ...