NYOJ 16 矩形嵌套(经典DP)
Posted 谦谦君子,陌上其华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于NYOJ 16 矩形嵌套(经典DP)的主要内容,如果未能解决你的问题,请参考以下文章