题目大意:中文题。

算法思路:这道题可以通过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定理的应用相关推荐

  1. 偏序集-Dilworth定理

    偏序的概念: 设A是一个非空集,P是A上的一个关系,若关系P是自反的.反对称的.和传递的,则称P是集合A上的偏序关系. 即P适合下列条件: (1)对任意的a∈A,(a,a)∈P; (2)若(a,b)∈ ...

  2. 偏序集的Dilworth定理学习 (转载)

    转自http://3214668848.blog.163.com/blog/static/48764919200991885836429/ 导弹拦截是一个经典问题:求一个序列的最长不上升子序列,以及求 ...

  3. 偏序集概念+Dilworth定理

    偏序的概念: 设A是一个非空集,P是A上的一个关系,若关系P是自反的.反对称的.和传递的,则称P是集合A上的偏序关系. 即P适合下列条件: (1)对任意的a∈A,(a,a)∈P; (2)若(a,b)∈ ...

  4. BZOJ1143[CTSC2008]祭祀river 偏序集及Dilworth定理

    这里讲一下我对偏序集的认识   如果有偏差可以评论我  我会修改 一:定义 (度娘上copy来的  不想看的可以跳过 设R是非空集合A上的一个二元关系,若R满足: 自反性.反对称性.传递性,则称R为A ...

  5. poj1548-Robots Dilworth定理(偏序集定理2)

    储备知识:Dilworth定理 偏序集的两个定理: 定理1) 令(X,≤)是一个有限偏序集,并令r是其最大链的大小.则X可以被划分成r个但不能再少的反链. 其对偶定理称为Dilworth定理: 定理2 ...

  6. 偏序集,Dilworth定理,以及经典的导弹拦截问题

    偏序集: 设R为非空集合A上的关系,如果R是自反的.反对称的和可传递的,则称R为A上的偏序关系,简称偏序,通常记作≦.一个集合A与A上的偏序关系R一起叫作偏序集,记作<A,R>或<A ...

  7. 最小链覆盖——Dilworth定理

    Dilworth定理 Dilworth定理,一言以蔽之,偏序集能划分成的最少的全序集个数等于最大反链的元素个数.------litble 狄尔沃斯定理(Dilworth's theorem)亦称偏序集 ...

  8. Dilworth 定理

    Dilworth 定理 对于偏序集 DDD,我们有若干概念: 链:DDD 中的一个子集 CCC 满足 CCC 中任意两个元素都可比,即构成全序集. 反链:DDD 中的一个子集 BBB 满足 BBB 中 ...

  9. Dilworth定理的简单应用(导弹拦截题解)

    写题时遇到一个计算导弹拦截系统的题解使用了Dilworth定理,浅写下个人理解. 一.百科解释 狄尔沃斯定理(Dilworth's theorem)亦称偏序集分解定理,是关于偏序集的极大极小的定理,该 ...

最新文章

  1. python基础知识点总结-Python基础知识总结
  2. C++继承体系下的对象构造
  3. linux 系统函数调用:open close read write lseek
  4. Trie 树是什么样的数据结构?有哪些应用场景?
  5. 【Docker】 安装 Docker
  6. OSG仿真案例(7)——osg自动驾驶
  7. php的异步非阻塞swoole模块使用(一)实现简易tcp服务器--服务端
  8. python英雄对战代码_Python爬虫获取op.gg英雄联盟英雄对位胜率代码
  9. oracle现金流量表逻辑,财务学习:现金流量表内在逻辑研究
  10. c语言除去字符串多余的空格,从一个字符串中去除多余的空格
  11. java常见的异种类_JCA - 自然 - BlogJava
  12. 《七哥说道》第十章:今天我,寒夜里看雪飘过
  13. 计算机网络到底讲了些什么
  14. 入门51单片机(STC8952RC)定时器、有关中断原理简述、寄存器设置与程序示例(包括流水灯和计时器)
  15. 嵌入式linux系统电源管理器,嵌入式Linux系统的动态电源管理技 - 嵌入式操作系统 - 电子发烧友网...
  16. 使用EasyX实现简单的五子棋双人对战
  17. 汽车行业能长出新“贝壳”吗?
  18. outlook邮箱日历华为手机与电脑同步设置
  19. Sams Teach Yourself AJAX in 10 Minutes
  20. 某中学培训机构的宣传稿

热门文章

  1. word转换成PDF后图片模糊的解决方法(究极方法)
  2. BZOJ4921 互质序列
  3. org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.fs.FileAlreadyExistsException)
  4. 365日历:信息与社区化的新模式
  5. centos6.5更换yum 163源,解决-bash: unzip: command not found
  6. 诺言税务官方下载_敏捷的诺言
  7. tools: subl :保存为GBK
  8. SpringBoot实战项目收藏(都是超级好的)
  9. APISIX网关简介与应用
  10. (注意unsupport)MSCRM中在业务部门中增加字段