Sicily/1437. Nested Dolls
2011-07-13 11:33 Min·zc 阅读(142) 评论(0) 编辑 收藏 举报应用Dilworth定理
关于Dilworth定理下面两个页面说的都很清楚
http://acm.tzc.edu.cn/forum/bbs_topic.do?postID=487
http://www.cppblog.com/sdfond/archive/2009/04/30/81522.html
题目要求x和y都是升序排列的链的最少划分,也就是x1<x2&&y1<y2
求上述的反链就是x1>=x2||y1>=y2
所以要将x按照升序排列,相同的x,y按照降序排列,然后再序列中选择反链序列
因为反链的条件是x1>=x2||y1>=y2,所以相同x可以归入同一条反链中,所以将y按照降序来排列,这样就保证了一个x可以选择到多个y的条件
----------------------------------------------------------------------------------------------------------------------------------------
1 #include <iostream>
2 #include <memory.h>
3 #include <algorithm>
4 using namespace std;
5 struct POINT
6 {
7 int x;
8 int y;
9 }pt[20010],vi[20010];
10 int cmp(const void* a,const void *b)
11 {
12 if(((POINT*)a)->x!=((POINT*)b)->x)
13 return ((POINT*)a)->x-((POINT*)b)->x;
14 else
15 return ((POINT*)b)->y-((POINT*)a)->y;
16 }
17 int main()
18 {
19 int t;
20 cin>>t;
21 while(t--)
22 {
23 memset(pt,0,sizeof(pt));
24 memset(vi,0,sizeof(vi));
25 int n;
26 cin>>n;
27 for(int i=0;i<n;i++)
28 cin>>pt[i].x>>pt[i].y;
29 qsort(pt,n,sizeof(pt[0]),cmp);
30 int ans=0;
31 for(int i=0;i<n;i++)
32 {
33 int flag=0;
34 for(int j=0;j<ans;j++)
35 {
36 if(vi[j].x<pt[i].x&&vi[j].y<pt[i].y)
37 {
38 flag=1;
39 vi[j].x=pt[i].x;
40 vi[j].y=pt[i].y;
41 }
42 if(flag)
43 break;
44 }
45 if(!flag)
46 {
47 vi[ans].x=pt[i].x;
48 vi[ans].y=pt[i].y;
49 ans++;
50 }
51 }
52 cout<<ans<<endl;
53 }
54 }