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(无回路有向图)中求最长路径的问题。对每一个矩形i,设d(i)为矩形i结尾的最长链的长度,则d(i)=Max{0,d(j)|(矩形j可以嵌套在矩形i中)}+1;
例题来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=16
代码实现:
#include "stdio.h"
#include "string.h"
#define N 1005 int n;
int dp[N];
int map[N][N]; struct point
{
int x,y;
}a[N]; int inline Max(int a,int b){ return a>b?a:b; } int Pudge(int a,int b,int c,int d)
{
if( (a<c&&b<d) || (b<c&&a<d) )
return ;
return ;
} int DFS(int k)
{
if(dp[k]!=-)
return dp[k];
int i;
dp[k] = ;
for(i=; i<n; i++)
{
if(map[i][k]==)
dp[k] = Max(dp[k],DFS(i)+);
}
return dp[k];
} int main()
{
int T;
int i,j;
int ans;
scanf("%d",&T);
while(T--)
{
ans = ;
scanf("%d",&n);
for(i=; i<n; i++)
scanf("%d %d",&a[i].x,&a[i].y);
memset(map,,sizeof(map));
for(i=; i<n; i++)
{
for(j=; j<n; j++)
{
if(i==j) continue;
if(Pudge(a[i].x,a[i].y,a[j].x,a[j].y))
map[i][j] = ;
}
}
memset(dp,-,sizeof(dp));
for(i=; i<n; i++)
ans = Max(ans,DFS(i));
printf("%d\n",ans);
}
return ;
}
02_嵌套矩形(DAG最长路问题)的更多相关文章
- NYOJ16 矩形嵌套(DAG最长路)
		矩形嵌套 紫书P262 这是有向无环图DAG(Directed Acyclic Graph)上的动态规划,是DAG最长路问题 [题目链接]NYOJ16-矩形嵌套 [题目类型]DAG上的dp & ... 
- 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)
		「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ... 
- uva 10051 Tower of Cubes(DAG最长路)
		题目连接:10051 - Tower of Cubes 题目大意:有n个正方体,从序号1~n, 对应的每个立方体的6个面分别有它的颜色(用数字给出),现在想要将立方体堆成塔,并且上面的立方体的序号要小 ... 
- 简单Dp----最长公共子序列,DAG最长路,简单区间DP等
		/* uva 111 * 题意: * 顺序有变化的最长公共子序列: * 模板: */ #include<iostream> #include<cstdio> #include& ... 
- BZOJ 5450 轰炸 (强连通缩点+DAG最长路)
		<题目链接> 题目大意: 有n座城市,城市之间建立了m条有向的地下通道.你需要发起若干轮轰炸,每轮可以轰炸任意多个城市.但每次轰炸的城市中,不能存在两个不同的城市i,j满足可以通过地道从城 ... 
- 嵌套矩形——DAG上的动态规划
		有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.非常多问题都能够转化为DAG上的最长路.最短路或路径计数问题. 题目描写叙述: 有n个矩形,每一个矩 ... 
- uva 10131 Is Bigger Smarter?(DAG最长路)
		题目连接:10131 - Is Bigger Smarter? 题目大意:给出n只大象的属性, 包括重量w, 智商s, 现在要求找到一个连续的序列, 要求每只大象的重量比前一只的大, 智商却要小, 输 ... 
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
		题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ... 
- BZOJ1093 [ZJOI2007]最大半连通子图 【tarjan缩点 + DAG最长路计数】
		题目 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G ... 
随机推荐
- C#设计模式——代理模式(Proxy Pattern)
			一.概述在软件开发中,有些对象由于创建成本高.访问时需要与其它进程交互等原因,直接访问会造成系统速度慢.复杂度增大等问题.这时可以使用代理模式,给系统增加一层间接层,通过间接层访问对象,从而达到隐藏系 ... 
- UnityShader快速上手指南(四)
			简介 由于其他项目中断了几天更新,继续~~ 这一篇主要是讲光照的(包含漫反射和高光以及多光源的处理) 还是先来看看具体效果(多光源后面单独展示) 有了基本的光照处理之后越来越有立体感了有不有 ╮(╯▽ ... 
- 解决打印机报错:操作无法完成(错误0x00000709)。
			解决:操作无法完成(错误0x00000709).再次检查打印机名称,并确保打印机已连接到... 上午同时说,网络打印机打印不了,于是首先看一下打印服务器IP是不是给换了,结果没换. 接着尝试重新添加一 ... 
- 才知道百度也提供了智能DNS服务 - 加速乐
			http://jiasule.baidu.com/ 智能DNS 依托百度多年积累的高精度DNS识别库,平均只需5秒全球DNS服务器全部生效,百度蜘蛛1秒生效.抗攻击.无限解析记录,免费支持电信.联通. ... 
- javascript的 == 与 === 的区别
			1.对于基础类型,例如string,number ==和===是有区别的 1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等 2)同类型比较,直 ... 
- [PE结构分析] 6.IMAGE_SECTION_HEADER
			IMAGE_SECTION_HEADER 的源代码如下: typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAM ... 
- 从零开始学习Linux (cd命令)
			上一篇博客中提到,我们学习命令大多都要参考 --help 这个选项.但是cd命令并没有这个选项. 我们可以通过 help cd 来查看cd的使用方式.其实cd命令挺简单的,它的作用是进入文件夹,也就是 ... 
- 【GPU编解码】GPU硬解码---CUVID
			问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ... 
- SwipeRefreshLayout下拉刷新
			1.SwipeRefreshLayout是Google在support v4 19.1版本的library更新的一个下拉刷新组件,实现刷新效果更方便. 弊端:只有下拉 //设置刷新控件圈圈的颜色 sw ... 
- 从Android系统出发,分析Android控件构架
			从Android系统出发,分析Android控件构架 Android中所有的控件追溯到根源,就是View 和ViewGroup,相信这个大家都知道,但是大家也许会不太清楚它们之间的具体关系是什么,在A ... 
