题解【CJOJ1070/UVA】嵌套矩形
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
8
14 9
15 19
18 12
9 10
19 17
15 9
2 13
13 10
Sample Output
4
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】嵌套矩形的更多相关文章
- CJOJ 1070 【Uva】嵌套矩形(动态规划 图论)
CJOJ 1070 [Uva]嵌套矩形(动态规划 图论) Description 有 n 个矩形,每个矩形可以用两个整数 a, b 描述,表示它的长和宽.矩形 X(a, b) 可以嵌套在矩形 Y(c, ...
- DAG上的动态规划之嵌套矩形
题意描述:有n个矩形,每个矩形可以用两个整数a.b描述,表示它的长和宽, 矩形(a,b)可以嵌套在矩形(c,d)当且仅当a<c且b<d, 要求选出尽量多的矩形排成一排,使得除了最后一个外, ...
- NYOJ16|嵌套矩形|DP|DAG模型|记忆化搜索
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a& ...
- DAG上的动态规划---嵌套矩形(模板题)
一.DAG的介绍 Directed Acyclic Graph,简称DAG,即有向无环图,有向说明有方向,无环表示不能直接或间接的指向自己. 摘录:有向无环图的动态规划是学习动态规划的基础,很多问题都 ...
- P1375 嵌套矩形
题目Problem 嵌套矩形 Time Limit: 1000ms Memory Limit: 131072KB 描述Descript. 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形 ...
- HDOJ-1069(动态规划+排序+嵌套矩形问题)
Monkey and Banana HDOJ-1069 这里实际是嵌套矩形问题的变式,也就是求不固定起点的最长路径 动态转移方程为:dp[i]=max(dp[j]+block[i].h|(i,j)∈m ...
- [ACM_动态规划] 嵌套矩形
问题描述:有n个矩阵,每个矩阵可以用两个整数a,b来表示 ,表示他的长和宽,矩阵X (a,b) 可以 嵌套 到Y (c,d) 里面当且仅当 a < c && b < d ...
- 02_嵌套矩形(DAG最长路问题)
来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题2: 问题描述:有n个矩形,每个矩形可以用两个整数a,b描述,表示它们的长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中的条件 ...
- tyvj1213 嵌套矩形
描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如 ...
随机推荐
- Spring BeanDefinitionHolder源码解析
BeanDefinitionHolder源码解析 继承关系 实现的接口 和BeanDefinition一样实现了BeanMetadataElement接口,获得了获取数据源(配置类的class对象)的 ...
- gulp常用插件之wiredep使用
更多gulp常用插件使用请访问:gulp常用插件汇总 wiredep这是一款gulp插件,能够将js.css文件自动插入到html中. 更多使用文档请点击访问wiredep工具官网. Bower是一个 ...
- Canvas如何绘制精美的图?
一.Canvas的基本使用 首先在使用Canvas一般先在<body>中添加: <canvas id="></canvas> 然后使用Js进行获取canv ...
- HashMap源码刨析(面试必看)
目录 1.Hash的计算规则? 2.HashMap是怎么形成环形链表的(即为什么不是线程安全)?(1.7中的问题) 3.JDK1.7和1.8的HashMap不同点? 4.HashMap和HashTab ...
- 微信小程序 --- 日历效果
wxml部分: <view class='box1' style='width: {{ sysW * 7 }}px'> <view class='dateBox'>{{ yea ...
- VsCode开发Java SpringBoot遇到的问题
报错截图 报错一:Build failed, Do you want to continue? 编译失败,你想继续吗? 报错二:ConfigError:The Project "Demo&q ...
- 【Unity|C#】基础篇(16)——文件读写(I/O类)
[笔记] 文件操作 File / FileInfo / FileStream https://www.runoob.com/csharp/csharp-file-io.html 文本读写 Stream ...
- cf 手机短信问题
题目链接:https://vjudge.net/contest/331120#problem/C 题目:你有一部手机,最多显示k个人发的信息,现在收到n条信息,有可能人是相同的人发的.最新的要顶置,当 ...
- Linux修复日志
阿里云后台系统报告漏洞,解决记录 中级: RHSA-2019:0049-重要: systemd 安全更新
- vue学习指南:第十五篇(详细) - Vuex
Vuex 一.基础 1. Vuex 相当于 vue的数据仓库 2. Vuex 是 vue 的状态管理工具 3. Vuex中的 state 只能通过mutations 改变 4. Vuex很适合做购物车 ...