题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=201
////////////////////////////////////////////////////////
此题的意思为找到严格递增或者严格递减的子序列的最长长度;
由于x的值各不相同,所以可以按照x排序;然后对y求最长递增子序列和最长递减子序列,去两者较大的输出;
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
struct mp
{
int x;
int y;
}a[1000];
int comp(const void * xx,const void * yy)
{
if((*(mp *)xx).x>(*(mp *)yy).x)
return 1;
return -1;
}
void execute()
{
int n;
cin>>n;
int i,j;
for(i=0;i<n;i++)
cin>>a[i].x>>a[i].y;
qsort(a,n,sizeof(a[0]),comp);
int sf[1000];//记录递增子序列长度;
int lf[1000];//记录递减子序列长度;
for(i=0;i<n;i++)
{
lf[i]=1;
sf[i]=1;
for(j=0;j<i;j++)
{
if(a[i].y>a[j].y)
if(sf[j]+1>sf[i])
sf[i]=sf[j]+1;
if(a[i].y<a[j].y)
if(lf[j]+1>lf[i])
lf[i]=lf[j]+1;
}
}
int ans=0;
int res=0;
for(i=0;i<n;i++)
{
if(ans<sf[i])
ans=sf[i];
if(res<lf[i])
res=lf[i];
}
ans=ans>res?ans:res;
cout<<ans<<endl;
}
int main()
{
int T;
cin>>T;
while(T--)
execute();
return 0;
}