#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1010;
int n, a[maxn], b[maxn]; // a表示长, b表示宽;
int G[maxn][maxn], d[maxn];
int dp(int i){
int &ans = d[i];
if(ans != -1) return ans;
ans = 1;
for(int j = 0; j < n; ++j){
if(G[i][j]){
ans = max(ans, dp(j)+1);
}
}
return ans;
}
int main()
{
int T;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
for(int i = 0; i < n; ++i){
scanf("%d%d", &a[i], &b[i]);
if(a[i] < b[i]) swap(a[i], b[i]); // 保证长>=宽;
}
memset(G, 0, sizeof(G));
for(int i = 0; i < n; ++i){ // 建图;
for(int j = 0; j < n; ++j){
if(a[i] > a[j] && b[i] > b[j])
G[i][j] = 1;
}
}
// d[i] 表示从节点i出发的最长路的长度
// 状态转移: d(i) = max{1, d(j)+1| G[i][j]==1}
memset(d, -1, sizeof(d));
int res = 0;
for(int i = 0; i < n; ++i){
res = max(res, dp(i));
}
printf("%d\n", res);
}
}
nyoj16矩形嵌套
最新推荐文章于 2019-09-15 15:51:20 发布