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

题目:

有 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;} }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java智能卡 技术_java智能卡APDU学习笔记

因项目需要&#xff0c;利用APDU通信协议在ME手机端和卡端进行通讯。在实践的过程中遇到一些问题&#xff0c;先记录如下。APDU协议&#xff0c;即是智能卡与读写器间的应用层协议&#xff0c;在ISO7816-4[7]中定义了该协议的结构格式。APDU数据有两种结构&#xff0c;读写器使…

(二叉树存储+递归遍历)Binary Tree Traversals

题目&#xff1a; A binary tree is a finite set of vertices that is either empty or consists of a root r and two disjoint binary trees called the left and right subtrees. There are three most important ways in which the vertices of a binary tree can be sys…

java mutator_Java-使用Accessor和Mutator方法

小编典典让我们看一下基础知识&#xff1a;“ Accessor”和“ Mutator”只是获取器和设置器的奇特名称。一个获取器“Accessor”返回一个类的变量或其值。设置器“ Mutator”设置类变量指针或其值。因此&#xff0c;首先您需要设置一个带有一些要获取/设置的变量的类&#xff1…

(二叉树创建+查找)精灵邮差

题目 精灵是非常奇特的生物。众所周知&#xff0c;他们可以活很长时间&#xff0c;他们神奇的能力不是一件容易接受的事情。此外&#xff0c;他们住在树上。但是&#xff0c;你可能不知道有些事情。虽然通过魔法传送提供东西非常方便&#xff08;很像电子邮件&#xff09;。他…

java反序列化异常接不到_由Java对象反序列化异常想到的

今天写代码时候遇到一个异常&#xff0c;异常信息如下&#xff1a;Caused by: java.lang.RuntimeException: java.util.concurrent.ExecutionException: org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.spri…

(找规律)Magic of David Copperfield

题目&#xff1a; 每一个参与的观众被要求将手指放在左上方的图片上&#xff08;即编号为1的图片&#xff09;&#xff0c;魔术师开始了&#xff1a;魔术师告诉观众在图片上移动k次&#xff08;移动是把手指放到上下左右相邻的图片上&#xff0c;如果那儿有图片的话&#xff0…

java 日期只计算年月日大小_Java 计算两个日期相差多少年月日

JDK7及以前的版本&#xff0c;计算两个日期相差的年月日比较麻烦。JDK8新出的日期类&#xff0c;提供了比较简单的实现方法。/*** 计算2个日期之间相差的 相差多少年月日* 比如&#xff1a;2011-02-02 到 2017-03-02 相差 6年&#xff0c;1个月&#xff0c;0天*paramfromDate Y…

(DAG+固定终点的最长路和最短路)硬币问题

##题目&#xff1a; 有n种硬币&#xff0c;面值分别为v1, v2, …, vn&#xff0c;每种都有无限多。给定非负整数S&#xff0c;可以选用多少个硬币&#xff0c;使得面值之和恰好为S&#xff1f;输出硬币数目的最小值和最大值。 Input 第一行两个整数&#xff0c;n&#xff0c;S…

java虚拟机堆栈工作原理_java虚拟机工作原理?

展开全部从宏观上介绍一下Java虚拟机的e5a48de588b662616964757a686964616f31333363373731工作原理。从最初编写的Java源文件(.java文件)是如何一步步执行的&#xff0c;如下图所示&#xff0c;首先Java源文件经过前端编译器(javac或ECJ)将.java文件编译为Java字节码文件&#…

(二分)Trailing Zeroes (III)

题目&#xff1a; n的阶乘尾部有q个连续的0&#xff0c;现在给你q&#xff0c;请你算出满足条件的n&#xff0c;如果有多个n满足条件&#xff0c;输出最小的那个即可。 Input 输入一个T(T < 10000),表示样例数量。 每个样例输入一个q。(1 < q < 100,000,000) Outp…

ais文件还原到mysql_SQLSERVER 数据库可疑的解决步骤

异常关机后&#xff0c;金蝶帐套突然无法访问&#xff0c;发现数据库置疑&#xff0c;使用此方案解决&#xff1a;注意&#xff1a;在做任何修复操作之前&#xff0c;请务必备份.mdf/.ndf以及.ldf文件。一般情况下这样可以解决&#xff1a;1、将数据库设置为应急状态ALTER DATA…

(DFS)n皇后问题

Problem Description 在N*N的方格棋盘放置了N个皇后&#xff0c;使得它们不相互攻击&#xff08;即任意2个皇后不允许处在同一排&#xff0c;同一列&#xff0c;也不允许处在与棋盘边框成45角的斜线上。 你的任务是&#xff0c;对于给定的N&#xff0c;求出有多少种合法的放置…

(DFS)棋盘问题(poj1321)

题目&#xff1a; 在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列&#xff0c;请编程求解对于给定形状和大小的棋盘&#xff0c;摆放k个棋子的所有可行的摆…

(BFS)Catch That Cow(poj3278)

题目&#xff1a; 农夫知道一头牛的位置&#xff0c;想要抓住它。农夫和牛都于数轴上 &#xff0c;农夫起始位于点 N(0<N<100000) &#xff0c;牛位于点 K(0<K<100000) 。农夫有两种移动方式&#xff1a; 1、从 X移动到 X-1或X1 &#xff0c;每次移动花费一分钟 2…

java jmx 监控_只用五分钟为系统实现基于JMX的监控

早期是作为J2EE的一部分, 因此总给人一种开发起来会很"重"的感觉, 这让不少Java程序员宁愿选择自行实现"轻量级"方案. 时至今日, 借助一些优秀的开源项目, JMX 也可以用起来很"轻".pojo-mbean 使用Annotation对MBean进行声明, 省去不少 JMX规范中…

(DFS or BFS)Find The Multiple(poj1426)

题目&#xff1a; 给定一个正整数n&#xff0c;请编写一个程序来寻找n的一个非零的倍数m&#xff0c;这个m应当在十进制表示时每一位上只包含0或者1。你可以假定n不大于200且m不多于100位。 提示&#xff1a;本题采用Special Judge&#xff0c;你无需输出所有符合条件的m&…

wsld2java axis_Weblogic+axis2安装

Weblogicaxis2安装实验环境系统版本使用到软件软件版本Redhat 6.3Ld-linux.so.2Ld-linux.so.2 安装的weblogic的需要安装(系统自带)Weblogic10.3Axis21.41在以下实验中我使用的是1.41的war包 &#xff0c;下载war包的话可以在weblogic中进行部署。实验步骤&#xff1a;启动webl…

java stl分解_[STL训练]寻梦-题解(Java代码)极简思路

注意事项: insert()方法只能被 StringBuffer 类的对象调用参考代码:import java.util.Scanner;public class Main {private static int n 0;public static void main(String[] args) {Scanner scanner new Scanner(System.in);n scanner.nextInt();int m n * 2;for (int i…

(BFS)Prime Path (poj3126)

题目&#xff1a; 孤单的zydsg又一次孤单的度过了520&#xff0c;不过下一次不会再这样了。zydsg要做些改变&#xff0c;他想去和素数小姐姐约会。 所有的路口都被标号为了一个4位素数&#xff0c;zydsg现在的位置和素数小姐姐的家也是这样&#xff0c;如果两个路口间只差1个数…

java图片资源存放_Java编程中图片文件放哪

举个例子&#xff1a;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;/*按扭类*/classBombextendsJButton{publicintnum_x,num_y;//第几号方块publicintBombRoundCount;//周围雷数...举个例子&#xff1a;import java.awt.*;import java.awt.event.*;import jav…