问题描述:
描述
每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000)
随后的n行,每行有两个数a,b(0<a,b<100),表示矩形的长和宽
1 10 1 2 2 4 5 8 6 10 7 9 3 1 5 8 12 10 9 7 2 2样例输出
5
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=1010;
int G[maxn][maxn];
int d[maxn],n;
struct note
{
int a,b;
}tri[maxn];
int dp(int i)
{
int& ans=d[i];//同时改变d[i]
if (d[i]>0) return ans;
ans=1;
for (int j=1;j<=n;j++) {
if (G[i][j]) ans=max(ans,dp(j)+1);
}
return ans;
}
/*
void print_ans(int i)
{
printf("%d ",i);
for (int j=1;j<=n;j++) {
if (G[i][j]&&d[i]==d[j]+1) {
print_ans(j);
break;
}
}
}
*/
int main()
{
int t;
scanf("%d",&t);
while (t--) {
scanf("%d",&n);
for (int i=1;i<=n;i++) {
int a,b;
scanf("%d%d",&a,&b);
if (a<b) swap (a,b);
tri[i].a=a;
tri[i].b=b;
}
memset (G,0,sizeof (G));
memset (d,0,sizeof (d));
for (int i=1;i<=n;i++) {//构图
for (int j=1;j<=n;j++) {
if (i==j) continue;
if (tri[i].a>tri[j].a&&tri[i].b>tri[j].b)
G[i][j]=1;
}
}
int ans=0;
for (int i=1;i<=n;i++) {
ans=max(ans,dp(i));
}
/*
cur记录的是ans的编号,如果有多个解,那么记录第一个
print_ans(cur);//用于输出路径
*/
printf("%d\n",ans);
}
return 0;
}