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. Ubuntu在当前用户目录下安装python 包

    对于tar.gz文件: tar -zxvf setuptools-19.6.tar.gz cd setuptools-19.6.tar.gz python3 setup.py build python ...

  2. 数据库中的sql语句总结

    初识SQL   1. 什么是SQL:结构化查询语言(Structured Query Language). 2. SQL的作用:客户端使用SQL来操作服务器.   > 启动mysql.exe,连 ...

  3. C++11智能指针(unique_ptr、shared_ptr、weak_ptr)(转)

    原文地址:https://blog.csdn.net/king_way/article/details/95536938

  4. vue中封装jsonp

    一.安装jsonp 二.封装

  5. canvas-文字粒子化(小程序)

    有2张画板,1张渲染文字为获取文字数组,另一张用来渲染粒子根据拿到的数组. step1:渲染文字,根据canvasGetImageData拿到rgba数组 step2:遍历rgba数组拿到粒子的坐标 ...

  6. (填坑系列) 用aio写server与client进行通信的坑

    最近闲来无事,就估摸着自己写个“服务注册中心”来玩,当然因为是个人写的,所以一般都是简洁版本. 代码地址在:https://gitee.com/zhxs_code/my-service-registe ...

  7. 【Python】1.PyQT5界面初尝试

    1->通过pycharm打开QTdesigner.创建新Form. 2->选择Widget创建 3->不添加任何控件 点击保存 pycharm列表如下 后缀名位ui的  即QTdes ...

  8. 熵权法(the Entropy Weight Method)以及MATLAB实现

    按照信息论基本原理的解释,信息是系统有序程度的一个度量,熵是系统无序程度的一个度量:如果指标的信息熵越小,该指标提供的信息量越小,在综合评价中所起作用理当越小,权重就应该越低.因此,可利用信息熵这个工 ...

  9. Python中matplotlib模块的简单使用

    测试代码如下: # encoding:utf-8 import numpy as np import matplotlib.pyplot as plt x = np.array([1,2,3,4,5, ...

  10. Struts2学习-jsp中超链接传参问题

    今天在学习过程中对struts2中超链接的传参问题产生了一些疑惑,不明白jsp中的超链接如何将参数传到Action方法中去的. <s:iterator value="categorys ...