引例:NYOJ16

矩形嵌套

时间限制: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

我们可以这样建模:将每个矩形视作一个结点,若矩形A能覆盖矩形B,那么就在作一条结点A指向结点B的有向路径,结果我们会得到一个DAG(有向无环图)。求符合条件的最多矩形数目,就是DAG中最长路径上的结点数目。
求DAG上的最长路径上的结点数目,我们可用记忆化搜索求解,(同poj1088滑雪)
代码如下:
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN=;
vector<int> G[MAXN];
int V,E;
int d[MAXN];
int dfs(int u)
{
if(d[u]>) return d[u];
int ans=;
for(int i=;i<G[u].size();i++)
{
ans=max(ans,dfs(G[u][i])+);
}
return d[u]=ans;
}
int main()
{
memset(d,,sizeof(d));
scanf("%d%d",&V,&E);
for(int i=;i<E;i++)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
}
int ans=;
for(int i=;i<=V;i++)
ans=max(ans,dfs(i));
printf("%d\n",ans+);
return ;
}
/*
7 8
1 2
1 3
3 2
2 4
2 5
4 6
6 5
5 7 7
*/

这样 矩形覆盖问题就迎刃而解。

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN=;
vector<int> G[MAXN];
struct Rect{
int x,y;
}rect[MAXN];
int n;
void createG()
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if((rect[i].x<rect[j].x&&rect[i].y<rect[j].y)||(rect[i].y<rect[j].x&&rect[i].x<rect[j].y))
{
G[j].push_back(i);
}
}
int d[MAXN];
int dfs(int u)
{
if(d[u]>) return d[u];
int ans=;
for(int i=;i<G[u].size();i++)
ans=max(ans,dfs(G[u][i])+);
return d[u]=ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
G[i].clear();
scanf("%d%d",&rect[i].x,&rect[i].y);
}
createG();
memset(d,,sizeof(d));
int ans=;
for(int i=;i<=n;i++)
ans=max(ans,dfs(i));
printf("%d\n",ans+);
} return ;
}

该问题也可以转化为最长上升子序列问题求解。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=;
struct Rect{
int x,y;
}rect[];
int n;
bool comp(const Rect &a,const Rect &b)
{
if(a.x==b.x) return a.y > b.y;//µ±±ß³¤ÏàͬʱÓдóµ½Ð¡ÅÅÐò
else return a.x < b.x;
}
int dp[];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d%d",&rect[i].x,&rect[i].y);
dp[i]=INF;
}
sort(rect,rect+n,comp);
for(int i=;i<n;i++)
*lower_bound(dp,dp+n,rect[i].y)=rect[i].y;
printf("%d\n",lower_bound(dp,dp+n,INF)-dp);
} return ;
}

DAG上的DP的更多相关文章

  1. UVA - 10131Is Bigger Smarter?(DAG上的DP)

    题目:UVA - 10131Is Bigger Smarter? (DAG) 题目大意:给出一群大象的体重和IQ.要求挑选最多的大象,组成一个序列.严格的体重递增,IQ递减的序列.输出最多的大象数目和 ...

  2. BZOJ 3998 TJOI2015 弦论 后缀自动机+DAG上的dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3998 题意概述:对于一个给定长度为N的字符串,求它的第K小子串是什么,T为0则表示不同位置 ...

  3. NYOJ16 矩形嵌套 【DAG上的DP/LIS】

    矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c ...

  4. UVA 10917 Walk Through the Forest(dijkstra+DAG上的dp)

    用新模板阿姨了一天,换成原来的一遍就ac了= = 题意很重要..最关键的一句话是说:若走A->B这条边,必然是d[B]<d[A],d[]数组保存的是各点到终点的最短路. 所以先做dij,由 ...

  5. BZOJ 4011 HNOI2015 落忆枫音 DAG上的dp(实际上重点在于分析)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题意概述:给出一张N点的DAG(从1可以到达所有的点),点1的入度为0.现在加一条原 ...

  6. UVA 11324 The Largest Clique(缩点+DAG上的dp)

    求最大团.和等价性证明有类似之处,只不过这个不是求互推,而是只要a->b,或b->a即可. 同样的,容易想到先缩点,得到DAG,每个节点上保存SCC的点数,相信任意一条由根节点(入度为零) ...

  7. Codeforces 919D Substring ( 拓扑排序 && DAG上的DP )

    题意 : 给出含有 N 个点 M 条边的图(可能不连通或者包含环),每个点都标有一个小写字母编号,然后问你有没有一条路径使得路径上重复字母个数最多的次数是多少次,例如图上有条路径的顶点标号顺序是  a ...

  8. (板子)缩点 + DAG上的DP(深搜)luogu P3387

    板子传送门 根据题目意思,我们只需要找出一条点权最大的路径就行了,不限制点的个数.那么考虑对于一个环上的点被选择了,一整条环是不是应该都被选择,这一定很优,能选干嘛不选.很关键的是题目还允许我们重复经 ...

  9. UVa1025 (DAG上的dp)

    这是紫书上的第一个dp哈. 1.状态定义:dp[i][j]---->到时刻i的时候(出发的时候时刻为0,约定时间为时刻time),从j号车站开往N号车站,在车站等待的最少的时间. 2.这个人当前 ...

随机推荐

  1. 使用cacheBuilder时捕获内部指定异常

    由于cacheBuilder是另起线程获取,对call方法中的抛出的异常进行了封装.所以我们在最外层捕获时是无法直接指定异常类型捕获的, 获取异常的原因判断实例类型 public static voi ...

  2. vue2.0 + vux (三)MySettings 页

    1.MySettings.vue <!-- 我的设置 --> <template> <div> <img class="img_1" sr ...

  3. Laravel 5.4建站06--API 认证系统 Passport

    介绍 在 Laravel 中,实现基于传统表单的登陆和授权已经非常简单,但是如何满足 API 场景下的授权需求呢?在 API 场景里通常通过令牌来实现用户授权,而非维护请求之间的 Session 状态 ...

  4. tree related problems (update continuously)

    leetcode Binary Tree Level Order Traversal 这道题是要进行二叉树的层次遍历.对于层次遍历,最简单直观的办法就是进行BFS.于是我们仅仅须要维护一个队列就能够了 ...

  5. freescale-sdk linux移植一搭建编译环境脚本host-prepare.sh分析

    接下来使用自己的课外歇息时间,对基于PowerPC架构freescale-sdk,进行linux移植和分析.主要參考官方文档freescale linux sdk START_HERE.html,首先 ...

  6. kubernetes之计算机资源管理

    系列目录 当你编排一个pod的时候,你也可以可选地指定每个容器需要多少CPU和多少内存(RAM).当容器请求特定的资源时,调度器可以更好地根据资源请求来确定把pod调度到哪个节点上.当容器请求限制特定 ...

  7. 后端程序员看前端想死(三)是不是该学点js了

    CSS盒子模型 div布局 js 这些都懂一点,但仅仅是懂一点,有时间就学一下咯

  8. Java ClassLoader详解(转载)

    Java ClassLoader详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK ...

  9. Eclipse-----Eclipse断点调试

  10. extjs中新建窗体时,给窗体添加背景图片不显示问题之一

    1.在extjs中新建窗体时,给窗体添加背景图片不显示,例如下面的代码. 不显示的原因:因为设置了  layout: 'fit', Ext.create('Ext.Window', { title: ...