现在的位置: 首页 > 综合 > 正文

NYOJ-16 矩形嵌套 动态规划

2017年11月10日 ⁄ 综合 ⁄ 共 1236字 ⁄ 字号 评论关闭

矩形嵌套

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

先对矩形进行排序,然后就跟找最长上升子序列差不多了。我博客里转载了一篇最长上升子序列的,讲得很仔细清楚。

01.#include
<iostream>
02.#include
<algorithm>
03.using namespace std;
04. 
05.#define
maxN 1002
06. 
07.struct node
08.{
09.int a;
10.int b;
11.}rect[maxN];
12. 
13.int ans[maxN];
14. 
15.bool compare(node
l,node r)
16.{
17.if(l.a==r.a)
18.return l.b<r.b;
19.return l.a<r.a;
20.}
21. 
22.int main()
23.{
24.int t,a,b;
25.cin>>t;
26.while(t--)
27.{
28.int n;
29.cin>>n;
30.for(int i=0;i<n;i++)
31.{
32.cin>>a>>b;
33.if(a>b)
34.{
35.a=a+b;
36.b=a-b;
37.a=a-b;
38.}
39.rect[i].a=a;
40.rect[i].b=b;
41.}
42.sort(rect,rect+n,compare);
43.for(int i=0;i<n;i++)ans[i]=1;
44.for(int i=1;i<n;i++)
45.{
46.int max=0;
47.for(int j=0;j<i;j++)
48.{
49.if((rect[j].a<rect[i].a)&&(rect[j].b<rect[i].b)&&ans[j]>max)
50.max=ans[j];
51.}
52.ans[i]=max+1;
53.}
54.int maxlen=1;
55.for(int i=0;i<n;i++)
56.{
57.if(ans[i]>maxlen)
58.maxlen=ans[i];
59.}
60.cout<<maxlen<<endl;
61.}
62.return 0;
63.}

抱歉!评论已关闭.