NYOJ 16 矩形嵌套(经典DP)

http://acm.nyist.net/JudgeOnline/problem.php?pid=16

矩形嵌套

时间限制: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

思路:经典DP。先按大小排好序,然后依次遍历每个矩形,计算当它作为最外边的矩形时所能嵌套的最大值。

 1 #include<iostream> 
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 const int maxn = 1000+5;
 6 
 7 int n;
 8 int dp[maxn];
 9 
10 struct node
11 {
12     int a, b;
13 }a[maxn];
14 
15 bool cmp(node x, node y)
16 {
17     if (x.a == y.a)    return x.b < y.b;
18     return x.a < y.a;
19 }
20 
21 int main()
22 {
23     //freopen("D:\txt.txt", "r", stdin);
24     int t;
25     cin >> t;
26     while (t--)
27     {
28         cin >> n;
29         for (int i = 0; i < n; i++)
30         {
31             cin >> a[i].a >> a[i].b;
32             if (a[i].a < a[i].b)
33             {
34                 int temp = a[i].b;
35                 a[i].b = a[i].a;
36                 a[i].a = temp;
37             }
38         }
39         sort(a, a + n, cmp);
40         int _Max = 0;
41         for (int i = 0; i < n; i++)
42         {
43             dp[i] = 1;
44             for (int j = 0; j < i; j++)
45             {
46                 if (a[j].a < a[i].a && a[j].b < a[i].b)
47                 {
48                     dp[i] = max(dp[i], dp[j] + 1);
49                 }
50             }
51             if (dp[i]>_Max)  _Max = dp[i];
52         }
53         cout << _Max << endl;
54     }        
55     return 0;
56 }
原文地址:https://www.cnblogs.com/zyb993963526/p/6358152.html