- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
? 小记3
小记4?
偏序集 Dilworth 定理 poj 1065 3636 1548在Partially order set偏序集有一个非常NX的定理叫Dilworth Theorem。上图是偏序集的一个Hasse diagram,偏序集的定义是
偏序是在集合X上的二元关系≤,它满足自反性、反对称性和传递性。即,对于X中的任意元素a,b和c,有:自反性:a≤a;反对称性:如果a≤b且b≤a,则有ab;传递性:如果a≤b且b≤c,则a≤c 。
带有偏序关系的集合称为偏序集。令X,≤是一个偏序集,对于集合中的两个元素a、b,如果有a≤b或者b≤a,则称a和b是可比的,否则a和b不可比。在X中,对于元素a,如果任意元素b,由b≤a得出ba,则称a为极小元。
一个反链A是X的一个子集,它的任意两个元素都不能进行比较。 一个链C是X的一个子集,它的任意两个元素都可比。
下面是两个重要定理:定理1 令(X,≤)是一个有限偏序集,并令r是其最大链的大小。则X可以被划分成r个但不能再少的反链。 其对偶定理称为Dilworth定理: 定理2 令(X,≤)是一个有限偏序集,并令m是反链的最大的大小。则X可以被划分成m个但不能再少的链。
搞清楚了反链和链的定义,就能够很好的从Hasse Diagram中得到理解。链就是从纵向的角度看 Hasse Diagram ,反链是从横向的角度看Hasse Diagram。
定理一,就是至少有r行构成反链关系。
定理二,就是至少有m列构成链关系。我们来考虑一个导弹拦截问题,就是求一个序列的最长不上升子序列,以及求能最少划分成几组不上升子序列。 很显然第一个是动态规划,动态规划的过程就是求Hasse Diagram的过程!!!第二问就是求最少能够划分成几个链,根据定理2 ,很显然就是反链的最大长度。反链就是一个上升子序列。即求一个严格上升子序列的最大长度。注意一个问题是,在获得偏序集有几个主链的时候,需要对数据集先进行排序,然后从头开始,沿着主链顺序DFS。由于导弹拦截的问题,天然有序,形成了严格上升自序列,所以没有凸显这个问题!POJ 1065 注意一个比较诡异的是algorithm 中的sort,会出现一个断言错误!。。。不太清楚什么情况。其他照做就OK
#include iostream#include vector#include algorithmusing namespace std;struct Stickint l;int w;;
int cmpStick a,Stick bifa.lb.lreturn a.w b.w;elsereturn a.l b.l;int main//freopenstick.in.txt,r,stdin;int T;cinT;forint t1;tT;t++int n;cinn;vector Stick Sn;forint i0;in;i++cinS[i].lS[i].w;int dp[6005];memsetdp,0,sizeofdp;sortS.begin,S.end,cmp;forint i0;in;i++ifdp[i]0dp[i]1;Stick cutS[i];forint ji+1;jn;j++if dp[j]0 cut.lS[j].l cut.wS[j].wdp[j]-1;cutS[j];int res0;forint i0;in;i++res+dp[i]1?1:0;coutresendl;return 0;POJ 3636
这个问题的顺序至关重要!!
为什么要对W和H的排序进行相反的操作!!!你可以想象一下在途中,你的遍历次序是从左下角走到右上角的,你选择反链数目的时候,必然是从斜对角线开始的!
#include algorithm#include cstdio#include set#include vector
using namespace std;
const int MAX_m 10000;
struct Dollint w, h;Dollint _w, int _h w _w; h _h; ;
bool cmpWincconst Doll a, const Doll b return a.w b.w;
struct cmpHdecbool operatorconst Doll a, const Doll b return a.h b.h; ;
int mainint C; scanf%d, C;for int c 0; c C; c++int m; scanf%d, m;vectorDoll SW;for int i 0; i m; i++int w, h;
文档评论(0)