题目:

有 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

分析与解答:

DAG意思是有向无环图,所谓有向无环图是指任意一条边有方向,且不存在环路的图

矩形之间的“可嵌套”关系是一个典型的二元关系,二元关系可以用图来建模。如果矩 形X可以嵌套在矩形Y里,就从X到Y连一条有向边这个有向图是无环的,因为一个矩形无 法直接或间接地嵌套在自己内部。换句话说,它是一个DAG。这样,所要求的便是DAG上 的最长路径。

方法

仿照数字三角形的做 法,设d(i)表示从结点i出发的最长路长度,第一步只能走到它 的相邻点,状态转移方程:d(i) = max { d(j) + 1 | (i,j) ∈E)

最终答案是所有d(i)中的最大值。

要先把图建立出来,假设用邻接矩阵保存在 矩阵G中。接下来编写 记忆化搜索程序(调用前需初始化d数组的所有值为0):

思考总结

1.
他初始化为0,我初始化为-1,如果矩阵的边相等,那么我是没有对这个邻接矩阵赋值的,因此,刘汝佳的代码不能直接套用,必须加上==1
2.
大家看题:除了最后一个之外,每一个矩形都可以嵌套在下一个矩形

我们邻接矩阵是根据 矩形X可以嵌套在矩形Y里,就从X到Y连一条有向边来建立的
说明最后一个一定是大矩形

那么打印出来就是由小矩形到大矩形的,

d(i)表示从结点i出发的最长路长度
这个路是以那个最大矩形为终止点的
那我们写dfs递归的意思是,d(i)嵌套在d(j)里,(d(i)比d(j)小),同时d(j)到最大矩形的距离最大

如果有多个最优解,矩形编号的字典序应最小。将所有d值计算出来以后,选择最最大d[i]所对应的i。如 果有多个i,则选择最小的i,这样才能保证字典序最小。接下来可以选择d(i)=d(j)+1且 (i,j)∈E的任何一个j。为了让方案的字典序最小,应选择其中最小的j

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;const int maxN=2000;int n;
int A[maxN];
int B[maxN];
int G[maxN][maxN];
int F[maxN];int dfs(int x);
void print_ans(int ans);int main()
{memset(F,-1,sizeof(F));memset(G,-1,sizeof(G));cin>>n;for (int i=1;i<=n;i++){cin>>A[i]>>B[i];}for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)if (((A[i]<A[j])&&(B[i]<B[j]))||((A[i]<B[j])&&(B[i]<A[j])))G[i][j]=1;for (int i=1;i<=n;i++)if (F[i]==-1)F[i]=dfs(i);int Ans=0;for (int i=1;i<=n;i++)if (F[i]>F[Ans])Ans=i;cout<<F[Ans]<<endl;print_ans(Ans);cout<<endl;return 0;
}int dfs (int i){int & ans=F[i];if(ans>0) return ans;ans=1;for(int j=1;j<=n;++j){if(G[i][j]==1) ans=max(ans,dfs(j)+1);} return ans;
}void print_ans(int i){printf("%d ",i);for(int j=1;j<=n;++j){//选最小的j if(G[i][j]==1&&(F[i]==F[j]+1)){print_ans(j);break;} }
}

(dag模型+最长路+字典序)嵌套矩形相关推荐

  1. 图论 —— DAG 图的最长路

    [概述] DAG 图的最长路问题是一个比较少见的问题,具体问题是:给出一个 DAG 图,寻找图中的最长路 在 AOE 网中,在找出关键路径后,对其进行 DFS 即可得到图的最长路,由于这种方法的实现过 ...

  2. 【EOJ Monthly 2019.02 - E】中位数(二分 ,中位数 ,−1/1变换,dp求解DAG最长路)

    题干: E. 中位数 单测试点时限: 10.0 秒 内存限制: 256 MB "你的地图是一张白纸,所以即使想决定目的地,也不知道路在哪里." QQ 小方最近在自学图论.他突然想出 ...

  3. C - Coolest Ski Route(关于DAG图的最长路问题四种解法)

    VJ链接 C - Coolest Ski Routehttps://vjudge.net/contest/491449#problem/C 首先是比赛中用的bfs写法 #include<iost ...

  4. DAG最长路(最短路)

    DAG就是有向无环图. DAG上的最长或者最短路是很重要的一类问题.很多问题都可以转化为DAG上的最长或者最短路径的问题.DAG求最短和最长路的方法一样. 本算法主要解决2个问题 1)求整个DAG中的 ...

  5. nyoj 10 skiing(DAG上的最长路,备忘录方法)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑 ...

  6. 嵌套矩形——DAG上的动态规划

    有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 题目描述: 有n个矩形,每个矩形可以用 ...

  7. POJ - 3160 Father Christmas flymouse DAG最长路

    又来做这一道缩点的裸题,发现图转化为DAG后明显是一个最长路,那么有没有固定都求法呢,查询资料后发现的确是一种固定的做法. DAG最长路,分为两种固定终点和不固定终点. 令dp[i]表示从i顶点出发能 ...

  8. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索

    题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...

  9. 【POJ - 3160】Father Christmas flymouse(Tarjan缩点,DAG最长路)

    题干: After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends s ...

最新文章

  1. VC2008 忽然无法调试DLL的解决方法
  2. 用jedis访问Redis进行对象存取示例
  3. JavaScript实现递归楼梯问题(带记忆的递归解决方案)算法(附完整源码)
  4. 这是一份通俗易懂的知识图谱技术与应用指南(转)
  5. python都有什么包_常用的Python包有哪些,如何快速掌握Python编程
  6. 两顶点的路径长度为k_计算两个顶点之间的所有可能路径
  7. 微服务升级优点_SpringCloud微服务架构升级总结
  8. 如何删除添加了.css()函数的样式?
  9. CF573E Bear and Bowling 贪心、分块、凸包
  10. python去除停用词_python jieba分词如何去除停用词
  11. Hadoop面试题及参考答案
  12. php怎么画五星红旗,php基于GD库画五星红旗的方法,phpgd库五星红旗
  13. 圣诞树拼图游戏unity制作
  14. 伤逝有感 文/江湖一剑客
  15. 已拦截跨源请求:同源策略禁止读取位于...的远程资源。(原因:CORS 请求未能成功)。
  16. 【React】做一个百万答题小项目
  17. 关于将EXCEL文件导入到MYSQL数据库的一些方法
  18. 百度智能云实战——静态文件CDN加速
  19. 邻接表形式存储图并且按广度优先搜索遍历的C语言实现
  20. Python(x,y)

热门文章

  1. 常用的作业调度算法应用练习
  2. .Net Core 开发成长路线图
  3. android 引用非 android 工程,Unity3D调用android方法(非插件方式)
  4. 求年龄和的c语言数据类型,第1章 c语言与数据类型.ppt
  5. mysql 回滚失败_Mysql非事务表回滚失败的现象
  6. python 全局变量使用报错没有定义_Python变量作用域代码解析
  7. python io操作有什么_Python笔记:文件IO操作
  8. python语言逆序符号_python的逆序
  9. list排序(Collections.sort())
  10. 计算机系统存储器分类和总线分类