代码改变世界

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 }