nyoj236 偏序集+dilworth定理的应用
题目大意:中文题。
算法思路:这道题可以通过dilworth定理,将原序列排序后,转化为求有多少个单调递增子序列(即求最大递减子序列的长度)。但是当我直接求单调递增子序列的个数的时候就过了,但转化为求最大递减子序列的长度的时候就超时了= =,实在是莫名其妙。。还是请各位大神帮我看看。。。
先看一下什么是偏序集,以及dilworth定理(以下内容转载自http://blog.csdn.net/sd6264456/article/details/8647752):
在Partially order set(偏序集)有一个非常NX的定理叫DilworthTheorem。上图是偏序集的一个Hasse diagram,偏序集的定义是
偏序是在集合X上的二元关系≤,它满足自反性、反对称性和传递性。即,对于X中的任意元素a,b和c,有:
自反性:a≤a;
反对称性:如果a≤b且b≤a,则有a=b;
传递性:如果a≤b且b≤c,则a≤c 。
带有偏序关系的集合称为偏序集。
令(X,≤)是一个偏序集,对于集合中的两个元素a、b,如果有a≤b或者b≤a,则称a和b是可比的,否则a和b不可比。
在X中,对于元素a,如果任意元素b,由b≤a得出b=a,则称a为极小元。
一个反链A是X的一个子集,它的任意两个元素都不能进行比较。
一个链C是X的一个子集,它的任意两个元素都可比。
下面是两个重要定理:
定理1令(X,≤)是一个有限偏序集,并令r是其最大链的大小。则X可以被划分成r个但不能再少的反链。
其对偶定理称为Dilworth定理:
定理2 令(X,≤)是一个有限偏序集,并令m是反链的最大的大小。则X可以被划分成m个但不能再少的链。
搞清楚了反链和链的定义,就能够很好的从HasseDiagram中得到理解。链就是从纵向的角度看 Hasse Diagram ,反链是从横向的角度看HasseDiagram。
定理一,就是至少有r行构成反链关系。
定理二,就是至少有m列构成链关系。
我们来考虑一个导弹拦截问题,就是求一个序列的最长不上升子序列,以及求能最少划分成几组不上升子序列。很显然第一个是动态规划,动态规划的过程就是求HasseDiagram的过程!!!
第二问就是求最少能够划分成几个链,根据定理2,很显然就是反链的最大长度。反链就是一个上升子序列。即求一个严格上升子序列的最大长度。
注意一个问题是,在获得偏序集有几个主链的时候,需要对数据集先进行排序,然后从头开始,沿着主链顺序DFS。由于导弹拦截的问题,天然有序,形成了严格上升自序列,所以没有凸显这个问题!
先上个ac的代码(直接求个数的)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 5050
int t,n;
typedef struct Node
{int l,w;
};
Node nodes[MAXN];
int dp[MAXN],MAXX;
bool cmp(Node n1,Node n2)
{if(n1.l!=n2.l)return n1.l<n2.l;return n1.w<n2.w;
}
int main()
{scanf("%d",&t);while(t--){scanf("%d",&n);int ans=0;memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++){scanf("%d%d",&nodes[i].l,&nodes[i].w);}sort(nodes+1,nodes+n+1,cmp);for(int i=1;i<=n;i++){if(dp[i]==0){ans++;int m=nodes[i].w;for(int j=i+1;j<=n;j++){if(nodes[j].w>=m&&dp[j]==0){m=nodes[j].w;dp[j]=1;}}}}printf("%d\n",ans);}return 0;
}
接下来是超时的(转化为求最大递减子序列的长度的)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 5050
int t,n;
typedef struct Node
{int l,w;
};
Node nodes[MAXN];
int dp[MAXN],MAXX;
bool cmp(Node n1,Node n2)
{if(n1.l!=n2.l)return n1.l<n2.l;return n1.w<n2.w;
}
int main()
{scanf("%d",&t);while(t--){scanf("%d",&n);int ans=0;for(int i=1;i<=n;i++){dp[i]=1;}for(int i=1;i<=n;i++){scanf("%d%d",&nodes[i].l,&nodes[i].w);}sort(nodes+1,nodes+n+1,cmp);for(int i=n-1;i>=1;i--){for(int j=i+1;j<=n;j++){if(nodes[i].w>nodes[j].w){if(dp[i]<dp[j]+1)dp[i]=dp[j]+1;}}}int MAXX=0;for(int i=1;i<=n;i++){if(MAXX<dp[i])MAXX=dp[i];}printf("%d\n",MAXX);}return 0;
}
nyoj236 偏序集+dilworth定理的应用相关推荐
- 偏序集-Dilworth定理
偏序的概念: 设A是一个非空集,P是A上的一个关系,若关系P是自反的.反对称的.和传递的,则称P是集合A上的偏序关系. 即P适合下列条件: (1)对任意的a∈A,(a,a)∈P; (2)若(a,b)∈ ...
- 偏序集的Dilworth定理学习 (转载)
转自http://3214668848.blog.163.com/blog/static/48764919200991885836429/ 导弹拦截是一个经典问题:求一个序列的最长不上升子序列,以及求 ...
- 偏序集概念+Dilworth定理
偏序的概念: 设A是一个非空集,P是A上的一个关系,若关系P是自反的.反对称的.和传递的,则称P是集合A上的偏序关系. 即P适合下列条件: (1)对任意的a∈A,(a,a)∈P; (2)若(a,b)∈ ...
- BZOJ1143[CTSC2008]祭祀river 偏序集及Dilworth定理
这里讲一下我对偏序集的认识 如果有偏差可以评论我 我会修改 一:定义 (度娘上copy来的 不想看的可以跳过 设R是非空集合A上的一个二元关系,若R满足: 自反性.反对称性.传递性,则称R为A ...
- poj1548-Robots Dilworth定理(偏序集定理2)
储备知识:Dilworth定理 偏序集的两个定理: 定理1) 令(X,≤)是一个有限偏序集,并令r是其最大链的大小.则X可以被划分成r个但不能再少的反链. 其对偶定理称为Dilworth定理: 定理2 ...
- 偏序集,Dilworth定理,以及经典的导弹拦截问题
偏序集: 设R为非空集合A上的关系,如果R是自反的.反对称的和可传递的,则称R为A上的偏序关系,简称偏序,通常记作≦.一个集合A与A上的偏序关系R一起叫作偏序集,记作<A,R>或<A ...
- 最小链覆盖——Dilworth定理
Dilworth定理 Dilworth定理,一言以蔽之,偏序集能划分成的最少的全序集个数等于最大反链的元素个数.------litble 狄尔沃斯定理(Dilworth's theorem)亦称偏序集 ...
- Dilworth 定理
Dilworth 定理 对于偏序集 DDD,我们有若干概念: 链:DDD 中的一个子集 CCC 满足 CCC 中任意两个元素都可比,即构成全序集. 反链:DDD 中的一个子集 BBB 满足 BBB 中 ...
- Dilworth定理的简单应用(导弹拦截题解)
写题时遇到一个计算导弹拦截系统的题解使用了Dilworth定理,浅写下个人理解. 一.百科解释 狄尔沃斯定理(Dilworth's theorem)亦称偏序集分解定理,是关于偏序集的极大极小的定理,该 ...
最新文章
- python基础知识点总结-Python基础知识总结
- C++继承体系下的对象构造
- linux 系统函数调用:open close read write lseek
- Trie 树是什么样的数据结构?有哪些应用场景?
- 【Docker】 安装 Docker
- OSG仿真案例(7)——osg自动驾驶
- php的异步非阻塞swoole模块使用(一)实现简易tcp服务器--服务端
- python英雄对战代码_Python爬虫获取op.gg英雄联盟英雄对位胜率代码
- oracle现金流量表逻辑,财务学习:现金流量表内在逻辑研究
- c语言除去字符串多余的空格,从一个字符串中去除多余的空格
- java常见的异种类_JCA - 自然 - BlogJava
- 《七哥说道》第十章:今天我,寒夜里看雪飘过
- 计算机网络到底讲了些什么
- 入门51单片机(STC8952RC)定时器、有关中断原理简述、寄存器设置与程序示例(包括流水灯和计时器)
- 嵌入式linux系统电源管理器,嵌入式Linux系统的动态电源管理技 - 嵌入式操作系统 - 电子发烧友网...
- 使用EasyX实现简单的五子棋双人对战
- 汽车行业能长出新“贝壳”吗?
- outlook邮箱日历华为手机与电脑同步设置
- Sams Teach Yourself AJAX in 10 Minutes
- 某中学培训机构的宣传稿
热门文章
- word转换成PDF后图片模糊的解决方法(究极方法)
- BZOJ4921 互质序列
- org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.fs.FileAlreadyExistsException)
- 365日历:信息与社区化的新模式
- centos6.5更换yum 163源,解决-bash: unzip: command not found
- 诺言税务官方下载_敏捷的诺言
- tools: subl :保存为GBK
- SpringBoot实战项目收藏(都是超级好的)
- APISIX网关简介与应用
- (注意unsupport)MSCRM中在业务部门中增加字段