描述
有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。
输入格式
第1行n (n<=2000)
第2到n+1行每行两个数a,b,表示这个矩形的长和宽
第2到n+1行每行两个数a,b,表示这个矩形的长和宽
输出格式
一个数,最多符合条件的矩形数目
测试样例1
输入
3
1 5
6 2
3 4
输出
2
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<vector> #define ll long long using namespace std; const int maxn = 2005; vector<int> g[maxn]; int n,a[maxn],b[maxn],topo[maxn],cnt; int f[maxn],ans; bool vis[maxn]; void dfs(int x){ vis[x] = true; for(int i = 0;i < g[x].size();i++){ if(!vis[g[x][i]]) dfs(g[x][i]); } topo[cnt--] = x; } void dp(int x){ if(!g[x].size()){ f[x] = 1; return; } for(int i = 0;i < g[x].size();i++){ if(!f[g[x][i]]) dp(g[x][i]); f[x] = max(f[x],f[g[x][i]] + 1); } ans = max(f[x],ans); } int main(){ cin>>n; for(int i = 1;i <= n;i++){ scanf("%d%d",&a[i],&b[i]); if(a[i] < b[i]) swap(a[i],b[i]); } for(int i = 1;i <= n;i++){ for(int j = i+1;j <= n;j++){ if(a[i] > a[j] && b[i] > b[j]) g[i].push_back(j); else if(a[j] > a[i] && b[j] > b[i]) g[j].push_back(i); } } cnt = n; for(int i = 1;i <= n;i++){ if(!vis[i]) dfs(i); } for(int i = 1;i <= n;i++){ if(!f[topo[i]]) dp(topo[i]); } cout<<ans; return 0; }