线性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集合可以存储和操 ...
随机推荐
- sql server 生成随机数 rand函数
https://docs.microsoft.com/en-us/sql/t-sql/functions/rand-transact-sql?view=sql-server-2017 在某一个区间内生 ...
- 2014年国内最热门的.NET开源项目TOP25
编者按:在2014年初时,微软宣布成立.NET基金会,全面支持开源项目.如今将过一年的时间,目前国内的开源项目到底如何了?下面我们就来细数一下国内25款比较优秀的.NET开源项目. 作者:acdoma ...
- libpcap 中调用ctime()时警告提示:
warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=] ...
- 使用spring的DefaultResourceLoader自定义properties文件加载工具类
转自:https://www.cnblogs.com/zrbfree/p/6230957.html import java.io.IOException; import java.io.InputSt ...
- Unity资源的查找
Object.Destroy static function Destroy(obj: Object, t: float = 0.0F): void; Description Removes a ...
- bzoj 1577: [Usaco2009 Feb]庙会捷运Fair Shuttle【贪心+线段树】
按结束时间排序,然后开个线段树,按照排序后的牛群贪心的选 贪心的依据是选哪头牛都是选,不如给后面的多省一点空间 #include<iostream> #include<cstdio& ...
- jSignature做手动签名,canvas支持触摸屏的签名涂鸦插件
整理的前面可以用的: <!doctype html> <html lang="en"> <head> <meta charset=&quo ...
- mydatepicker97 日历控件
官方教程: http://www.my97.net/
- 自定义View(10)*onSizeChanged,onMeasure,onDraw的注意事项及正确写法
1,onSizeChanged 触发: 当view的第一次分配大小或以后大小改变时的产生的事件. 工作: 计算绘制内容的位置,面积等相关值.避免每次在onDraw中计算了. 注意: 计算时不要忘记pa ...
- Linq 内连接和外连接(转载)
一.内连接 Model1Container model = new Model1Container(); //内连接 var query = from s in model.Student join ...