问题描述:有n个矩阵,每个矩阵可以用两个整数a,b来表示 ,表示他的长和宽,矩阵X (a,b) 可以 嵌套 到Y (c,d) 里面当且仅当 a < c &&  b < d  ||  a < d && b < c . 选出最多这种矩阵。先输出最多的数量,在输出最小字典序路径。
问题分析:本题是DAG(有向无环图)最长路问题,设d[i]为以i结尾的最长链的长度,则状态转移方程为:d[i]=max{0,d[j]|矩形j可以嵌套在矩形i中}+1 ;这里用map[i][j]存储i可嵌入j中
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1000+5 class Rect{
public:
int length;
int width;
};
bool ok(Rect& a,Rect& b){ //嵌套关系判定函数
return (a.length<b.length && a.width<b.width)
||(a.length<b.width && a.width<b.length);
} int d[maxn],n,map[maxn][maxn]; //d[]用来存储以i结尾的最大长度,map[i][j]表示i可嵌套在j中
Rect rect[maxn]; int dfs(int cur) //深搜,记忆化搜索
{
if( d[cur] > ) return d[cur];//已经找过的直接输出
d[cur] = ; //没找的先付初值1,然后深搜寻找
for(int i=;i<=n;i++)
{
if( map[cur][i] && d[cur] < dfs(i)+)
{
d[cur] = dfs(i)+;
}
}
return d[cur];
}
void out(int i) //反向追踪找到选取图形的标号
{
cout << i << " ";
for(int j=;j<=n;j++)
{
if( map[i][j] && d[i] == d[j]+)
{
out(j);
break;
}
}
} int main(){ for(;cin>>n && n;){ int i,j; for(i=;i<=n;i++){ //输入
cin>>rect[i].length>>rect[i].width;
} memset(map,,sizeof(map)); //构造一个嵌套关系的邻接矩阵
for(i=;i<=n;i++)
for(j=;j<=n;j++)
if(ok(rect[i],rect[j]))
map[i][j]=; memset(d,,sizeof(d)); //深搜记忆化完成d[]表
for(i=;i<=n;i++){
dfs(i);
} int max=,ds; //找出d[]的最大值并用ds存储尾链位置
for(i=;i<=n;i++){
if(max<d[i]){
max=d[i];
ds=i;
}
} cout<<max<<'\n';
out(ds);cout<<'\n';
}
}

[ACM_动态规划] 嵌套矩形的更多相关文章

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

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

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

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

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

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

  4. 【动态规划】矩形嵌套 (DGA上的动态规划)

    [动态规划]矩形嵌套 时间限制: 1 Sec  内存限制: 128 MB提交: 23  解决: 9[提交][状态][讨论版] 题目描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a, ...

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

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

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

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

  7. P1375 嵌套矩形

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

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

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

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

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

随机推荐

  1. axure设置变量值

    以登录框为例设置axure变量值 1.打开axure,打开新页面命名为login,拖入一个矩形背景,命名:登录背景图 2.拖入标签控件和输入框控件分别命名为用户名:.userName.密码:.pass ...

  2. http statusCode(状态码) 200、300、400、500序列

    201-206都表示服务器成功处理了请求的状态代码,说明网页可以正常访问.        200(成功)  服务器已成功处理了请求.通常,这表示服务器提供了请求的网页.        201(已创建) ...

  3. vi/vim使用进阶: vimrc初步

    本节所用命令的帮助入口: :help compatible :help mapleader :help map :help autocmd 当vim在启动时,如果没有找到vimrc或gvimrc,它缺 ...

  4. python中协程的使用示例

    例子1 把字符串分割为列表 def line_splitter( delimiter = None ): print( 'ready to split' ) result = None while T ...

  5. c#.net中参数修饰符ref,out ,params解析

    params ============================================================================================= ...

  6. android ProgressBar 进度条的进度两端是圆角的方法

    转自 http://www.jianshu.com/p/6e7ea842d5ce 另外工作原理可以参考http://blog.csdn.net/lan603168/article/details/44 ...

  7. 企业搜索引擎开发之连接器connector(二十九)

    在哪里调用监控器管理对象snapshotRepositoryMonitorManager的start方法及stop方法,然后又在哪里调用CheckpointAndChangeQueue对象的resum ...

  8. php模拟登陆的两种实现方法分析

    php模拟登陆的实现方法分析 本文实例分析了php模拟登陆的实现方法.分享给大家供大家参考.具体分析如下: php模拟登陆的实现方法,这里分别列举两种方法实现模拟登陆人人网.具体实例代码如下: 1)使 ...

  9. CSS浮动(float,clear)通俗讲解

    首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.如下图: 可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1后边,因为d ...

  10. ansible 自动化(2)

    模块介绍: copy模块 使用copy模块,可以将本地文件一键复制到远程服务器:-a后跟上参数,参数中指定本地文件和远端路径: [root@ZABBIX ~]# ansible glq -m copy ...