矩形嵌套

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

#include<bits/stdc++.h>

using namespace std;

#define N 1005
struct node
{
int x,y;
}a[N]; bool cmp(node a,node b)
{
return (a.x<b.x || a.x==b.x&&a.y<b.y);
} int dp[N]; int main()
{
int t, n;
cin >> t;
while(t--)
{
int Max = 0;
cin >> n;
for(int i=0; i<n; i++){
cin >> a[i].x >> a[i].y;
dp[i] = 1;
if(a[i].x<a[i].y) swap(a[i].x,a[i].y);//长必须比宽大-鲁棒性
} sort(a,a+n,cmp); //按照长、宽由小到大排序 //核心代码:LIS(n^2)
for(int i=0; i<n; i++){
for(int j=0; j<i; j++){
if(a[j].x < a[i].x && a[j].y < a[i].y) //判断条件:后一个(i)矩阵的长宽都比前一个(j)要大才能容纳前一个形成俄罗斯套娃【突然想到俄罗斯套娃也是这个调调】/嵌套矩阵
dp[i] = max(dp[i],dp[j]+1);
}
} //遍寻最大嵌套矩阵
for(int i=0; i<n; i++)
Max = max(Max, dp[i]);
printf("%d\n",Max);
}
return 0;
}
/*
1
10
1 2
2 4
5 8
6 10
7 9
3 1
5 8
12 10
9 7
2 2
*/

ologn

#include<bits/stdc++.h>

using namespace std;

#define N 1005
struct node
{
int x,y;
}a[N]; bool cmp(node a,node b)
{
//一般的最末位的元素较小的在之后的会更加有优势 但是嵌套的要大 所以排序时候应该把y由大到小
return (a.x < b.x || a.x == b.x && a.y > b.y);
} int dp[N]; int main()
{
int t, n;
cin >> t;
while(t--)
{
int Max = 0;
cin >> n;
for(int i=0; i<n; i++){
cin >> a[i].x >> a[i].y;
dp[i] = 1;
if(a[i].x<a[i].y) swap(a[i].x,a[i].y);
}
sort(a,a+n,cmp);
vector<int> v;
for(int i=0; i<n; i++){
if(lower_bound(v.begin(),v.end(),a[i].y) == v.end())
v.push_back(a[i].y);
else *lower_bound(v.begin(),v.end(),a[i].y) = a[i].y;
}
printf("%d\n",v.size());
}
return 0;
}

[图论]

#include <cstdio>
#include <cstring> const int maxn = 1005;
int n, G[maxn][maxn];
int a[maxn], b[maxn];
int dp[maxn]; //将x和y的最大值存在x中
inline void CMAX(int& x, int y){
if (y > x){
x = y;
}
} /* 采用记忆化搜索 求从s能到达的最长路径 */
int DP(int s){
int& ans = dp[s];
if (ans > 0)
return ans;
ans = 1;
for (int j = 1; j <= n; ++j){
if (G[s][j]){
CMAX(ans, DP(j) + 1);
}
}
return ans;
} void print_ans(int i){
printf("%d ", i);
for (int j = 1; j <= n; ++j){
if (G[i][j] && dp[j] + 1 == dp[i]){
print_ans(j);
break;
}
}//for(j)
} int main()
{
#ifdef _LOCAL
freopen("D:\\input.txt", "r", stdin);
#endif
while (scanf("%d", &n) == 1){
//n个矩形
for (int i = 1; i <= n; ++i){
//默认a存长,b存宽(a > b)
scanf("%d%d", a + i, b + i);
if (a[i] < b[i]){
swap(a[i], b[i]);
}
}
/*
建图 G[i][j]为1表示矩形i可以嵌套在矩形j中
那么原问题便转化为求DAG上的最长路径 定义状态dp[i]表示从结点i出发可以到达的最长路径
则 dp[i] = max(dp[j] + 1), 其中 G[i][j]=1,
*/
memset(G, 0, sizeof G);
for (int i = 1; i <= n; ++i){
for (int j = 1; j <= n; ++j){
//矩形i的长和宽都小于矩形j的长和宽
if (a[i] < a[j] && b[i] < b[j]){
G[i][j] = 1; //可以嵌套,则有边
}
}
}//for(i)
memset(dp, 0, sizeof dp);
int ans = 0;
int best;
for (int i = 1; i <= n; ++i){
if (DP(i) > ans){
ans = dp[i];
best = i;
}
}//for(i)
printf("ans = %d\n", ans);
print_ans(best);
printf("\n");
}
return 0;
}

NYOJ16 矩形嵌套 【DAG上的DP/LIS】的更多相关文章

  1. NYOJ 16 矩形嵌套 (DAG上的DP)

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

  2. NYOJ_矩形嵌套(DAG上的最长路 + 经典dp)

    本题大意:给定多个矩形的长和宽,让你判断最多能有几个矩形可以嵌套在一起,嵌套的条件为长和宽分别都小于另一个矩形的长和宽. 本题思路:其实这道题和之前做过的一道模版题数字三角形很相似,大体思路都一致,这 ...

  3. nyoj16矩形嵌套(第一道dp关于dag的题目)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=16 题意:有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c, ...

  4. NYOJ16 矩形嵌套(DAG最长路)

    矩形嵌套 紫书P262 这是有向无环图DAG(Directed Acyclic Graph)上的动态规划,是DAG最长路问题 [题目链接]NYOJ16-矩形嵌套 [题目类型]DAG上的dp & ...

  5. DAG上的DP

    引例:NYOJ16 矩形嵌套 时间限制:3000 ms  |           内存限制:65535 KB 难度:4   描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可 ...

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

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

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

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

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

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

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

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

随机推荐

  1. PowerDesigner常用功能总结

    1.PowerDesigner设计表时显示注释列Comment 选中准备编辑的表,[右键]->[Properties]->[Columns]->[Customize Columns ...

  2. 为什么要搞vim

    一. 先得想清楚折腾vim受的这顿折磨值不值.值.零碎记录几点. 迫使我使用vim的原因如下: (1)之前实习的公司的开发机上只有vim,以后工作的公司也只有vim,同部门的同事大都用vim:如果不用 ...

  3. js学习日记-各种宽高总结(配图)

    1.窗口和浏览器 window.innerWidth.window.innerHeight   浏览器内部可用宽高 window.outerWidth.window.outerHeight   浏览器 ...

  4. 程序员必备PC维修法(硬件篇)

    自检自修不是万能,但不会自检自修却万万不能.程序员修电脑还是有必要的. 情景:通电情况下,电脑主机无法启动,所有主机内部硬件无反应. 原因:1.CPU.主板.电源积尘.(出现率30%) 2.CPU.主 ...

  5. NodeJs02 美女爬虫

    note: demo代码要编号 导出模块 一个js文件就是一个模块,模块内部的所有变量,对象,方法对外界都不可见.如果想暴漏出去让别人用,就需要导出模块.语法如下: module.exports = ...

  6. shell之route命令相关

    使用下面的 route 命令可以查看 Linux 内核路由表. # route Destination Gateway Genmask Flags Metric Ref Use Iface 192.1 ...

  7. 关系、关系模式、关系模型blablabla...

    好久没碰<数据库系统概论>了,最近翻了翻发现好多专业名词都忘记了, 现在有空特地记录下. 名词解释 数据:数据就是数据库中存储的基本数据,比如学生的学号.学生的班级数据库:存放数据的仓库数 ...

  8. NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet

    springMVC 内嵌jetty时,出现了NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet: 添加了 ...

  9. [CF1036C]Classy Numbers

    题目大意:多个询问,每个询问问$[l,r](1\leqslant l\leqslant r\leqslant10^{18})$内有多少个数满足非零数位小于等于$3$. 题解:数位$DP$,$f_{i, ...

  10. 机器学习-- Logistic回归 Logistic Regression

    转载自:http://blog.csdn.net/linuxcumt/article/details/8572746 1.假设随Tumor Size变化,预测病人的肿瘤是恶性(malignant)还是 ...