嵌套矩形

矩形嵌套

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内
输入
第一行是一个正正数N(0<N<10),表示测试数据组数,
每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000)
随后的n行,每行有两个数a,b(0<a,b<100),表示矩形的长和宽
输出
每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行
样例输入
1
10
1 2
2 4
5 8
6 10
7 9
3 1
5 8
12 10
9 7
2 2
样例输出
5
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #define N 1100
 5 
 6 int G[N][N];
 7 int n,max;
 8 int ans[N];
 9 int d[N];
10 typedef struct
11 {
12     int l,w;
13 } s;
14 s r[N];
15 int f(int);
16 
17 /*
18 void print_ans(int t,int count)
19 {
20     int i,j;
21     if(count==1)
22     {
23         max=0;
24         for(i=1; i<=n; i++)
25             max=max<d[i]?d[i]:max;
26         for(i=1; i<=n; i++)
27         {
28             if(d[i]==max)
29             {
30                 ans[count]=i;
31                 print_ans(i,count+1);
32             }
33         }
34     }
35     else if(count>max)
36     {
37         for(i=1; i<=max; i++)
38             printf("%d%c",ans[i],i==max?'\n':' ');
39         puts("\n*************************\n");
40     }
41     else
42     {
43         for(j=1; j<=n; j++)
44         {
45             if(G[t][j]&&d[t]==d[j]+1)
46             {
47                 ans[count]=j;
48                 print_ans(j,count+1);
49             }
50         }
51     }
52 }
53 */
54 
55 int main(void)
56 {
57     int i,j,t;
58     scanf("%d",&t);
59     while(t--)
60     {
61         scanf("%d",&n);
62         memset(G,0,sizeof(G));
63         memset(d,0,sizeof(d));
64         for(i=1; i<=n; i++)
65         {
66             scanf("%d%d",&(r+i)->l,&(r+i)->w);
67         }
68         for(i=1; i<=n; i++)
69             for(j=1; j<=n; j++)
70             {
71                 if(i-j)
72                 {
73                     if((r[i].l<r[j].l&&r[i].w<r[j].w)||(r[i].l<r[j].w&&r[i].w<r[j].l))
74                         G[i][j]=1;
75                 }
76             }
77             for(i=1;i<=n;i++)
78                 f(i);
79        long long max=0;
80        for(i=1;i<=n;i++)
81         max=max<d[i]?d[i]:max;
82        printf("%I64d\n",max);
83     }
84     return 0;
85 }
86 
87 int f(int i)
88 {
89     int j;
90     int ans=d[i];
91     if(ans>0)
92         return ans;
93     ans=1;
94     for(j=1; j<=n; j++)
95         if(G[i][j])
96             ans=ans<(f(j)+1)?(f(j)+1):ans;
97     return d[i]=ans;
98 }

 


题目分析:先将各组长方形的边长用结构数组存起来,然后用邻接矩阵将各长方形的嵌套关系存起来,构成一个有向无环图,由于没有规定起点,所以任何一个长方形都可作为初始状态,遍历各个节点,求出d[i],其中d[i]表示从第i个节点出发的最大长度,d[i]=max(d[j]+1)(G[i][j]为1),然后最优解为max(d[i]).函数f(int i)利用ans对d[i]形成一个引用,应当注意。

posted on 2013-07-15 23:58  rootial  阅读(1032)  评论(0编辑  收藏  举报

导航