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;
}
时间: 2024-12-28 15:08:35

tyvj1213 嵌套矩形的相关文章

嵌套矩形 DAG上的dp(深搜+dp)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一

嵌套矩形——DAG上的动态规划

有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 题目描述: 有n个矩形,每个矩形可以用两个整数a,b描述,表示它的长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d,或者b<c,a<d(相当于把矩形X旋转90°).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)内.你的任务是选出尽可能多的矩形排成一行.使得除了最后一个之外,每个矩形都

NYOJ16|嵌套矩形|DP|DAG模型|记忆化搜索

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内. 输入 第一行是一个正正数N(0<N<10),表示测试数据组数,每组测

uva 437 The Tower of Babylon(动态规划 嵌套矩形问题最长路)

有思路就去做,要相信自己 多处理更复杂的情况,你就不觉得现在复杂了 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; struct soli { ll a,b,c; }s[40]; int n; ll d[40][3]; int vis[40][3]; ll answer[40][3]; ll dp(int s1,int s2

经典动态规划 嵌套矩形

描述有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内. 输入 第一行是一个正正数N(0<N<10),表示测试数据组数, 每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=100

DAG模型:嵌套矩形

有n个矩形,每个矩形可以用两个整数a,b描述,表示它的长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当 a<c,b<d,或者b<c,a<d(相当于把矩形X旋转90°).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在 (3,4)内.你的任务是选出尽可能多的矩形排成一行.使得除了最后一个之外,每个矩形都可以嵌套在下一个矩形内. 分析: 矩形之间的"可嵌套"关系是一个典型的二元关系,二元关系可以用图来建模.如果矩形X可以嵌套在矩形Y里,我们就从X到Y连

02_嵌套矩形(DAG最长路问题)

来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题2: 问题描述:有n个矩形,每个矩形可以用两个整数a,b描述,表示它们的长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中的条件为:当且仅当a<c,b<d 或者b<c,a<d(相当于把矩形X旋转90 度).选出尽量多的矩形排成一行,使得除了最后一个之外,每一个矩形都可以嵌套在下一个矩形内. 分析:对于本题中的n个矩形,以每个矩形作为一个点,若X矩形能嵌套在Y矩形中,则从X向Y连一条边,题目则变为了在DAG(无回

嵌套矩形(动态规划)

思路: 先把这些矩形统一 一下,让最长边向下,然后按大小放好. 这样,我们就可以来构建DAG图形, 令,被包含的矩形a与包含的矩形b看成a一一>b的路线,这样就形成了这样的图形: ,我们一定知道最小矩形一定是不能包含其他矩形的(因为没有矩形比最小矩形还小),同时,知道最大矩形一定不能被包含.(因为没有矩形比最大矩形大) 为什么,我们要考虑最大和最小矩形呢? 最小矩形和最大矩形是这整个dp的边界!同时,给出了dp的走势. #include<iostream> #include<alg

经典DP 嵌套矩形 (南洋理工ACM—16)

本来是个很水的DP,结果被自己的代码习惯给打败了 代码: 1 #include<iostream> 2 #include<stdlib.h> 3 #include<string.h> 4 5 using namespace std; 6 7 typedef struct rectangle 8 { 9 int x; 10 int y; 11 }Rectangle; 12 13 Rectangle a[1002]; 14 int map[1002][1002]; 15 i