Description

有 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) 内。
你的任务是选出尽量多的矩形,使得除了最后一个之外,每一个矩形都可以嵌套在下一个矩形内。

Input

第一行一个正整数 n (n <= 1000)。
接下来 n 行每行两个正整数 a, b 表示矩形 i 的长和宽。

Output

第一行一个整数 k 表示符合条件的最多矩形数。
第二行 k 个整数依次表示符合条件矩形的编号,要求字典序最小。

Sample Input


14 9 
15 19 
18 12 
9 10 
19 17 
15 9 
2 13 
13 10

Sample Output


4 8 3 2

Hint

最大嵌套深度为 4 。
4 个矩形分别是:4(9, 10) < 8(13, 10) < 3(18,12) < 2(15,19)

Source

入门经典,DP,DAG(有向无环图)

Solution

此题是最长路模板。

最长路可以用DP来求,具体实现过程是这样的:

inline int DP(int p)
{
if(dp[p]>)//特判
{
return dp[p];
} dp[p]=;//初值 for(register int j=; j<=n; j++)//枚举所有出边
{
if(m[p][j]==)//如果有边
{
dp[p]=max(dp[p],DP(j)+);//就进行DP
}
} return dp[p];//返回
}

有了这个模板,此题就非常好做了:

  先预处理处所有相连接的边,然后进行DP,最后统计答案。

Code

 #include <bits/stdc++.h>

 using namespace std;

 inline int read()//快速读入
{
int f=,x=;
char c=getchar(); while(c<'' || c>'')
{
if(c=='-')f=-;
c=getchar();
} while(c>='' && c<='')
{
x=x*+c-'';
c=getchar();
} return f*x;
} struct Node
{
int x,y;
} a[];
int n,dp[],m[][],sum=-; inline int check(Node w,Node q)//预处理处矩形是否嵌套
{
if(w.x<q.x && w.y<q.y)return ; if(w.y<q.x && w.x<q.y)return ; return ;
} inline int DP(int p)//DP主过程
{
if(dp[p]>)
{
return dp[p];
} dp[p]=; for(register int j=; j<=n; j++)
{
if(m[p][j]==)
{
dp[p]=max(dp[p],DP(j)+);
}
} return dp[p];
} inline void print(int ans)
{
printf("%d ",ans);//输出当前边 for(register int i=; i<=n; i++)//枚举所有出边
{
if(m[ans][i]== && dp[ans]==dp[i]+)//如果有边
{
print(i);//递归输出 break;
}
}
} int main()
{
memset(dp,-,sizeof(dp));
memset(m,-,sizeof(m)); n=read(); for(register int i=; i<=n; i++)
{
a[i].x=read(),a[i].y=read();
} for(register int i=; i<=n; i++)
{
for(register int j=; j<=n; j++)
{
if(check(a[i],a[j]))
{
m[i][j]=;//连边
}
}
} for(register int i=; i<=n; i++)//计算各边长度
{
if(dp[i]==-)
{
dp[i]=DP(i);
}
} for(register int i=; i<=n; i++)//统计答案
{
if(dp[i]>dp[sum])
{
sum=i;
}
} printf("%d\n",dp[sum]);//输出总数 print(sum);//打印路径 return ;
}

题解【CJOJ1070/UVA】嵌套矩形的更多相关文章

  1. CJOJ 1070 【Uva】嵌套矩形(动态规划 图论)

    CJOJ 1070 [Uva]嵌套矩形(动态规划 图论) Description 有 n 个矩形,每个矩形可以用两个整数 a, b 描述,表示它的长和宽.矩形 X(a, b) 可以嵌套在矩形 Y(c, ...

  2. DAG上的动态规划之嵌套矩形

    题意描述:有n个矩形,每个矩形可以用两个整数a.b描述,表示它的长和宽, 矩形(a,b)可以嵌套在矩形(c,d)当且仅当a<c且b<d, 要求选出尽量多的矩形排成一排,使得除了最后一个外, ...

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

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

  4. DAG上的动态规划---嵌套矩形(模板题)

    一.DAG的介绍 Directed Acyclic Graph,简称DAG,即有向无环图,有向说明有方向,无环表示不能直接或间接的指向自己. 摘录:有向无环图的动态规划是学习动态规划的基础,很多问题都 ...

  5. P1375 嵌套矩形

    题目Problem 嵌套矩形 Time Limit: 1000ms    Memory Limit: 131072KB 描述Descript. 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形 ...

  6. HDOJ-1069(动态规划+排序+嵌套矩形问题)

    Monkey and Banana HDOJ-1069 这里实际是嵌套矩形问题的变式,也就是求不固定起点的最长路径 动态转移方程为:dp[i]=max(dp[j]+block[i].h|(i,j)∈m ...

  7. [ACM_动态规划] 嵌套矩形

    问题描述:有n个矩阵,每个矩阵可以用两个整数a,b来表示 ,表示他的长和宽,矩阵X (a,b) 可以 嵌套 到Y (c,d) 里面当且仅当 a < c &&  b < d  ...

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

    来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题2: 问题描述:有n个矩形,每个矩形可以用两个整数a,b描述,表示它们的长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中的条件 ...

  9. tyvj1213 嵌套矩形

    描述    有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如 ...

随机推荐

  1. 0011 基于DRF框架开发(04 普通序列化器)

    普通序列化器和模型无关,只是对针对提交字段的定义. 本文定义三个序列化器: 教师序列化器,学生序列化器,教师学生序列化器.这三个序列化器都使用普通序列化器. 1 教师序列化器 在Application ...

  2. springMVC三大组件、spring主要jar包、

    一.springMVC三大组件 处理器映射器   RequestMappingHandlerMapping 处理器适配器 RequestMappingHandlerAdapter 视图解析器  Int ...

  3. Python Django文件上传

    文件保存本地 view视图 def update(request): if request.method =='GET': return render(request,'update.html') e ...

  4. Linux 编译安装python3

    编译安装python3的步骤 1.很重要,必须执行此操作,安装好编译环境,c语言也是编译后运行,需要gcc编译器golang,对代码先编译,再运行,python是直接运行yum install gcc ...

  5. OI学习之路上的宝藏网站/App分享

    OI学习之路上的宝藏网站/App分享 想要变强吗少年?这里有各种我平时收集的网站/App,它们可以帮助你更好地学习算法或者找到解题思路.废话不多说,快来打开新世界的大门罢~ 知识学习 觉得各种知识晦涩 ...

  6. 0级搭建类004-中标麒麟 Linux 安装 (V7.0) 公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  7. react-native构建基本页面1---主页:tab栏

    配置Tab栏 配置Tab栏的图标 注意:使用图标,需要接收 license; /** * Sample React Native App * https://github.com/facebook/r ...

  8. 微信小程序调试页面的坑

    使用微信开发者工具切新的页面保存刷新无法在左侧直接预览必须在app.json文件配置页面(填写路径但是不用写后缀名),并且把想要预览的页面放在第一个位置.

  9. 常用sql 2018.08.31

    concat()函数 concat(str1, str2,...)功能:将多个字符串连接成一个字符串 返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null. 如:CONCA ...

  10. Ubuntu16.04突然断网

    配置文件: sudo gedit /etc/network/interfaces 重启网络: 1.sudo /etc/init.d/networking restart 2.sudo service ...