→题目链接←
先令所有的矩形的x,y都是x<=y的
再以x为第一关键字,y为第二关键字,从小到大排序
然后就变成了找一个二维的最长上升子序列
n<=100所以n^2 dp就行
*注意两个矩形全等不算包含
代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
struct node{
int x,y;
friend bool operator < (node a,node b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
};
int n;
node a[110];
int dp[110];
int main(){
scanf("%d",&n);
for(int i=0; i<n; i++){
scanf("%d%d",&a[i].x,&a[i].y);
if(a[i].x>a[i].y)swap(a[i].x,a[i].y);
}
sort(a,a+n);
for(int i=0; i<n; i++){
dp[i]=1;
for(int j=0; j<i; j++){
if(a[j].x<=a[i].x && a[j].y<=a[i].y && !(a[j].x==a[i].x && a[j].y==a[i].y)){
dp[i]=max(dp[i],dp[j]+1);
}
}
}
int ans=0;
for(int i=0; i<n; i++)ans=max(ans,dp[i]);
printf("%d\n",ans);
return 0;
}