首页 > 代码库 > 嵌套矩形 DAG上的dp(深搜+dp)
嵌套矩形 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)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。
- 输入
- 第一行是一个正正数N(0<N<10),表示测试数据组数,
每组测试数据的第一行是一个正正数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
- 来源
- 经典题目
- 上传者
- 张云聪
- 这题搞了好久,看白书上说的挺容易的,但是自己错漏百出,把所以的缺点都暴露出来了,挺好!
- 刚开始用vector建图直接TLE,刚开始没看出来,然后才感觉出来,改成数组邻接表2688ms,水过。用矩阵建图反正才12ms,唉……题目中的图正好是稠密图,所以不管用vector还是数组邻接表时间都很多也是这个原因,妹的!以前做图论还没遇到卡这的,现在终于遇到了。
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #define PI acos(-1.0) #define mem(a,b) memset(a,b,sizeof(a)) #define sca(a) scanf("%d",&a) #define sc(a,b) scanf("%d%d",&a,&b) #define pri(a) printf("%d\n",a) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define MM 204 #define MN 1008 #define INF 2000000000 #define eps 1e-8 using namespace std; typedef long long ll; typedef unsigned long long ULL; int n,dp[MN],head[MN*10],cnt; struct node { int x,y; }e[MN]; struct no { int v,next; }ee[MN*10]; void add(int u,int v) { ee[cnt].v=v,ee[cnt].next=head[u],head[u]=cnt++; } bool cmp(node a,node b) { if(a.x==b.x) return a.y<b.y; return a.x<b.x; } int dfs(int u) { if(dp[u]) return dp[u]; int i,ans=1; for(i=head[u];i!=-1;i=ee[i].next) ans=max(ans,dfs(ee[i].v)+1); //深搜下去,找到点就是嵌套的矩形+1了 return ans; } int main() { int t; sca(t); while(t--) { int i,j,x,y,Max=-INF; mem(dp,0); mem(head,-1); cnt=0; sca(n); for(i=1;i<=n;i++) { sc(x,y); if(x>y) swap(x,y); e[i].x=x,e[i].y=y; } sort(e+1,e+n+1,cmp); for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) if(e[i].x<e[j].x&&e[i].y<e[j].y) add(i,j); for(i=1;i<=n;i++) Max=max(Max,dfs(i)); pri(Max); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。