tyvj1213 嵌套矩形

描述

   有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,表示这个矩形的长和宽

输出格式

一个数,最多符合条件的矩形数目

测试样例1

输入


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;
}

 

posted @ 2016-07-20 19:11  ACforever  阅读(194)  评论(0编辑  收藏  举报