题目Problem
嵌套矩形
Time Limit: 1000ms Memory Limit: 131072KB
描述Descript.
有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内
输入Input
第1行n (n<=2000)
第2到n+1行每行两个数a,b,表示这个矩形的长和宽
第2到n+1行每行两个数a,b,表示这个矩形的长和宽
输出Output
一个数,最多符合条件的矩形数目
样例Sample
输入数据
3
1 5
6 2
3 4
输出数据
2
备注Hint
smartoj没评测机啊。。。
也不知道对不对,,
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=;
void read(int & n)
{
char c='+';int x=;bool flag=;
while(c<''||c>'')
{c=getchar();if(c=='-')flag=;}
while(c>=''&&c<='')
{x=x*+(c-);c=getchar();}
flag==?n=-x:n=x;
}
int map[MAXN][MAXN];
struct node
{
int hang;
int lie;
int id;
}a[MAXN*];
int ans=;
int n;
int dis[MAXN];
int M_s(int p)
{
ans=max(ans,dis[p]);
if(dis[p])
return dis[p];
for(int i=;i<=n;i++)
{
if(map[p][i])
return dis[p]=max(dis[p],M_s(i)+);
}
}
int main()
{
read(n);
for(int i=;i<=n;i++)
{
int x,y;
read(x);read(y);
a[i].hang=x;a[i].lie=y;a[i].id=i;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j)
if((a[i].hang<a[j].hang&&a[i].lie<a[j].lie)||(a[i].lie<a[j].hang&&a[i].hang<a[j].lie))
map[a[i].id][a[j].id]=; M_s();
int out=;
for(int i=;i<=n;i++)
{
out=max(out,dis[i]+);
}
printf("%d",out);
return ;
}