题目

有很多小木棍需要机器处理。每个小木棍有重量和长度两个属性。不断把小木棍放入机器中,如果小木棍\(a\)放完后放入小木棍\(b\),那么如果\(a.weight<=b.weight\ and\ a.length<=b.length\),机器就可以以0的时间处理完这根木棍,否则需要花1的时间初始化。最开始也需要一次初始化。给出所有小木棍的信息,求一共需要多久处理完所有的小木棍。

分析

这题的做法有两种做法,其实差不多。

我们考虑贪心,先把小木棍按\(weight\)递增排序(\(weight\)相等的\(length\)递增)排序,这样就处理掉了第一维。接下来只要不断地找最长不下降序列即可。复杂度为\(O(n^2)\)

第二种用到了Dilworth定理。这个定理主要处理的是偏序中的问题。

Dilworth定理

定义偏序\(a\le b\)满足:

  • 若\(a\le a\)则\(a=a\)
  • 若\(a\le b\ and\ b\le a\),则\(a=b\)
  • 若\(a\le b\ and\ b\le c\),则\(a\le c\)

    其中符号\(\le\)为定义的比较,不一定是数值大小的比较,也可能是二元组的比较关系,或者是整除关系(\(a\le b\)表示\(a|b\),容易发现这个定义满足上面的三个性质)。

这三个性质分别称为自反性,反对称性和传递性。

定义:

  • \(a\),\(b\)不可比为\(a\le b\)与\(b\le a\)均不满足(例如定义比较为整除,那么3与6,8与2可比,但3与7,15与8不可比)。
  • 为一列有序的元素,满足\(a_i\le a_{i+1}\)。
  • 反链为一个集合,满足其中元素两两不可比。
  • 极小元在集合中最小。即设极小元为\(a\),那么若有\(b\le a\),那么可以推出\(b=a\)。如果没有这样的\(b\),也称\(a\)为极小元。所以极小元一定是存在的(除非集合为空)。

定理(都在给定集合\(S\)与比较关系\(C\)中讨论):

  • \(d\)为最长链长度,那么集合一定可以被划分成至少\(d\)个反链。
  • \(e\)为最长反链长度,那么集合一定可以被划分成至少\(e\)个链。

第二个定理就是\(Dilworth\)定理。

定理一证明

设最小反链个数为\(x\)

  • 最长链中任意两个元素如果在同一个反链中就会导致反链中有两个元素可比,不符合反链的定义,所以至少需要\(d\)个反链,即\(x\ge d\)。
  • 不断从集合中删除极小元(或极小元集合)\(A_i\),删除\(k\)次后集合为空,那么每个\(A_1,A_2...A_k\)都是一组反链,所以有\(k\ge x\)。而又因为存在\(a_1\le a_2\le ...a_k\),其中\(a_i\in A_i\)(否则早就被删掉了),组成了一个链,所以有\(d\ge k\),所以\(d\ge k\ge x\)
  • 综上,有\(d\ge x\),\(x\ge d\),所以有\(x=d\)。

定理二证明

设最小链个数为\(x\)

  • 最长反链中任意两个元素不能处于同一个链,否则链中有两个元素不可比,根据传递性,这个链不满足定义,故至少需要\(e\)个链,即\(x\ge e\)。
  • 将最长反链中每个元素都分入一个集合,考虑剩下的反链中的元素,它们一定与最长反链中的某一个元素可比,否则就会被加入最长反链中。所以我们把每个不在最长反链中的元素放入与它可比的最长反链中的元素的集合中(与它可比的最长反链中的元素一定唯一,否则根据传递性,反链不满足定义),我们就构造出了一种做法,使得最小链个数等于最长反链长度,即\(x=e\),由上面的证明,我们知道它最小。

在小木棍的问题中,我们要求的其实是最小链个数,由定理二可得它等于最长反链长度。所以问题转化成了求二维偏序中的最长反链长度。我们把序列按第一维递增,第一维相等第二维递增的方式排序,那么我们就只需要,求出第二维的最长下降子序列即可,因为如果第一维不严格递增,第二维严格递减,那么这两个元素就是不可比的,所以构成了反链。第二维的最长下降子序列用动态规划的方法可以\(O(n^2)\)求出。

代码

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<algorithm>
  4. using namespace std;
  5. int read() {
  6. int x=0,f=1;
  7. char c=getchar();
  8. for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
  9. for (;isdigit(c);c=getchar()) x=x*10+c-'0';
  10. return x*f;
  11. }
  12. const int maxn=5e3+10;
  13. int f[maxn];
  14. struct log {
  15. int w,l;
  16. inline bool operator < (const log a) const {
  17. return w==a.w?l<a.l:w<a.w;
  18. }
  19. } a[maxn];
  20. int main() {
  21. #ifndef ONLINE_JUDGE
  22. freopen("test.in","r",stdin);
  23. #endif
  24. int T=read();
  25. while (T--) {
  26. int n=read();
  27. for (int i=1;i<=n;++i) a[i].w=read(),a[i].l=read();
  28. sort(a+1,a+n+1);
  29. int ans=0;
  30. for (int i=1;i<=n;++i) {
  31. f[i]=1;
  32. for (int j=1;j<i;++j) if (a[j].l>a[i].l) f[i]=max(f[i],f[j]+1);
  33. ans=max(ans,f[i]);
  34. }
  35. printf("%d\n",ans);
  36. }
  37. return 0;
  38. }

poj1065-Wooden Sticks的更多相关文章

  1. POJ-1065 Wooden Sticks,排序+最长单减子序列!

                                                       Wooden Sticks 题意:有一台机器处理木材,最开始需要一分钟准备,如果后面处理的木材比前 ...

  2. HDU-1051/POJ-1065 Wooden sticks 木棍子(动态规划 LIS 线型动归)

    嘤嘤嘤,实习半年多的小蒟蒻的第一篇博客(题解) 英文的: There is a pile of n wooden sticks. The length and weight of each stick ...

  3. POJ1065 Wooden Sticks(贪心+动态规划——单调递减或递增序列)

    描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于 第i个处理的木棒,那么将不会耗费时间,否则 ...

  4. poj1065 Wooden Sticks[LIS or 贪心]

    地址戳这.N根木棍待处理,每根有个长x宽y,处理第一根花费1代价,之后当处理到的后一根比前一根长或者宽要大时都要重新花费1代价,否则不花费.求最小花费代价.多组数据,N<=5000 本来是奔着贪 ...

  5. POJ1065(Wooden Sticks)--贪心

    木棍 时间限制: 1000MS   内存限制: 10000K 提交总数: 27336   接受: 11857 描述 有一堆木棍.每根杆的长度和重量是预先已知的.这些木棍将由木工机器逐一加工.它需要一些 ...

  6. HDOJ 1051. Wooden Sticks 贪心 结构体排序

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. POJ 1065 Wooden Sticks

    Wooden Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16262 Accepted: 6748 Descri ...

  8. HDU ACM 1051/ POJ 1065 Wooden Sticks

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  9. 1051 Wooden Sticks

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  10. Wooden Sticks

    Wooden Sticks Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total ...

随机推荐

  1. bos开发日记一

    BOS项目 第1天 项目12天安排: 1-2天:项目概述.搭建开发环境.主页设计.持久层和表现层设计 3-6天:项目业务开发(取派员.区域.分区.定区.业务受理)---整个项目分为基础设置.取派.中转 ...

  2. 成都Uber优步司机奖励政策(2月18日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. 【NAS】NFS中的fsid如何理解

    最近在NAS项目中遇到对NFS的fsid有点疑惑.就深入了解一番 在nfs的配置文件/etc/exports中,fsid作为一个共享参数,具体含义如下: 格式: fsid=num|root|uuid ...

  4. CC3200底板测试-烧写CC3200-LAUNCHXL

    1. 拿到板子,先研究一下几个跳线帽的作用.我在底板上测到VCC_DCDC_3V3和VCC_BRD之间应该有一个跳线帽的,但是在原理上找不到. 2. LED灯的用途,测试的时候,发现这个灯有时候亮,有 ...

  5. serv-u自动停止的解决方法

    在主界面serv-u管理控制台-主页--管理服务器----服务器详细信息下,点击“创建,修改并删除服务器事件”找到“事件”右击空白处---“添加”然后如下图所示填写: 点击“保存”就好了,而且我自己也 ...

  6. linux 解压命令大全[转]

    本文转自:  http://www.cnblogs.com/eoiioe/archive/2008/09/20/1294681.html .tar 解包:tar xvf FileName.tar打包: ...

  7. hdu2149Public Sale(巴什博弈)

    Public Sale Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. APP性能测试工具-GT(随身调)

    GT(随身调)是APP的随身调测平台,它是直接运行在手机上的“集成调测环境”(IDTE, Integrated Debug Environment).利用GT,仅凭一部手机,无需连接电脑,您即可对AP ...

  9. 【SpringCloud】第四篇:断路器(Hystrix)

    前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...

  10. lintcode First Unique Number In Stream

    First Unique Number In Stream 描述: Given a continuous stream of numbers, write a function that return ...