两种解法,第一种是用DAG
#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;
struct rectT
{
int a,b;
};
int min(int a,int b)
{
return a>b?b:a;
}
//s 代表以第 i个矩形为结尾的最长的。
int map[1005][1005],s[1005];
rectT rects[1005];
int dp(int i,int n)
{
int temp;
if(s[i]!=0)return s[i];
s[i]=1;
for(int j=1;j<=n;j++)
{
if(map[i][j]==1)
{
temp=dp(j,n);
if(temp+1>s[i])s[i]=temp+1;
}
}
return s[i];
}
int main()
{
ifstream fin("ha.txt");
int N,n,max=0;
cin>>N;
while(N--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)map[i][j]=99999999;
map[i][i]=0;
}
for(int i=1;i<=n;i++)cin>>rects[i].a>>rects[i].b;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if((rects[i].a<rects[j].a&&rects[i].b<rects[j].b)||(rects[i].b<rects[j].a&&rects[i].a<rects[j].b))
{
map[j][i]=1;
}
}
}
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++)dp(i,n);
for(int i=1;i<=n;i++){if(s[i]>max)max=s[i];}
cout<<max<<endl;
}
}