点击打开链接
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
struct Node
{
int a,b;
}Rec[1005];
struct Seqlen
{
int len,wide;
}seqlen[1005];
bool cmp(Node x,Node y)
{
return x.a<y.a;
}
bool cmp1(Node x,Node y)
{
return x.b<y.b;
}
int main()
{
int N=0,n=0,i=0,j=0,maxn1=0,maxn2=0,maxlen1=0,maxlen2=0;
scanf("%d",&N);
while(N--){
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d%d",&Rec[i].a,&Rec[i].b);
if(Rec[i].a<Rec[i].b) swap(Rec[i].a,Rec[i].b);
}
/*for(i=0;i<n;i++){
printf("%d %d\n",Rec[i].a,Rec[i].b);
}*/
///按长度来排序
for(i=0;i<n;i++){
seqlen[i].len=seqlen[i].wide=1;
}
sort(Rec,Rec+n,cmp);
maxlen1=1;
for(i=1;i<n;i++){
maxn1=0,maxn2=0;
for(j=0;j<i;j++){
if(Rec[j].a<Rec[i].a&&seqlen[j].len>maxn1&&Rec[j].b<Rec[i].b&&seqlen[j].wide>maxn2){
maxn1=seqlen[j].len;
maxn2=seqlen[j].wide;
}
}
seqlen[i].len=maxn1+1;
seqlen[i].wide=maxn2+1;
if(seqlen[i].len>maxlen1)
maxlen1=seqlen[i].len;
}
/// printf("%d\n",maxlen);
///按宽度来排序
for(i=0;i<n;i++){
seqlen[i].len=seqlen[i].wide=1;
}
sort(Rec,Rec+n,cmp1);
maxlen2=1;
for(i=1;i<n;i++){
maxn1=0,maxn2=0;
for(j=0;j<i;j++){
if(Rec[j].a<Rec[i].a&&seqlen[j].len>maxn1&&Rec[j].b<Rec[i].b&&seqlen[j].wide>maxn2){
maxn1=seqlen[j].len;
maxn2=seqlen[j].wide;
}
}
seqlen[i].len=maxn1+1;
seqlen[i].wide=maxn2+1;
if(seqlen[i].wide>maxlen2)
maxlen2=seqlen[i].wide;
}
printf("%d\n",max(maxlen1,maxlen2));
}
return 0;
}