问题描述:有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)内。你的任务是选出尽可能多的矩形排成一行。使得除了最后一个之外,每个矩形都可以嵌套在下一个矩形内。如果有多解,矩阵编号的字典序应该尽量小。

思路:见紫书。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <cstring>
  6. #include <string>
  7. #include <vector>
  8. #include <map>
  9. #include <set>
  10. #include <queue>
  11. #include <deque>
  12. #include <stack>
  13. #include <list>
  14.  
  15. #define FRER() freopen("in.txt", "r", stdin)
  16. #define FREW() freopen("out.txt", "w", stdout)
  17.  
  18. #define INF 0x3f3f3f3f
  19.  
  20. using namespace std;
  21.  
  22. /*
  23. 1
  24. 10
  25. 1 2
  26. 2 4
  27. 5 8
  28. 6 10
  29. 7 9
  30. 3 1
  31. 5 8
  32. 12 10
  33. 9 7
  34. 2 2
  35. */
  36. const int maxn = + ;
  37.  
  38. typedef pair<int, int> P;
  39.  
  40. P point[maxn];
  41.  
  42. int G[maxn][maxn], d[maxn], n;
  43.  
  44. int dp(int i) {
  45. if(d[i])
  46. return d[i];
  47. int& ans = d[i];
  48. ans = ;
  49. for(int j = ; j <= n; ++j)
  50. if(G[i][j])
  51. ans = max(ans, dp(j) + );
  52. return ans;
  53. }
  54.  
  55. void print(int i) {
  56. cout << i << ' ';
  57. for(int j = ; j <= n; ++j)
  58. if(G[i][j] && d[i] == d[j] + ) {
  59. print(j);
  60. return ;
  61. }
  62. }
  63.  
  64. int main()
  65. {
  66. ios::sync_with_stdio();
  67. cin.tie();
  68.  
  69. int T;
  70. cin >> T;
  71. while(T--) {
  72. memset(G, , sizeof(G));
  73. memset(d, , sizeof(d));
  74. cin >> n;
  75. for(int i = ; i <= n; ++i) {
  76. cin >> point[i].first >> point[i].second;
  77. for(int j = ; j < i; ++j) {
  78. if(point[i].first < point[j].first && point[i].second < point[j].second)
  79. G[i][j] = ;
  80. else if(point[j].first < point[i].first && point[j].second < point[i].second)
  81. G[j][i] = ;
  82. }
  83. }
  84. int idx = ;
  85. for(int i = ; i <= n; ++i)
  86. if(dp(i) > d[idx])
  87. idx = i;
  88. cout << d[idx] << endl;
  89. print(idx);
  90. cout << endl;
  91. }
  92. return ;
  93. }

DAG上的动态规划——嵌套矩阵问题的更多相关文章

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

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

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

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

  3. UVa 103 Stacking Boxes --- DAG上的动态规划

    UVa 103 题目大意:给定n个箱子,每个箱子有m个维度, 一个箱子可以嵌套在另一个箱子中当且仅当该箱子的所有的维度大小全部小于另一个箱子的相应维度, (注意箱子可以旋转,即箱子维度可以互换),求最 ...

  4. 第九章(二)DAG上的动态规划

    DAG上的动态规划: 有向无环图上的动态规划是学习DP的基础,很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 1.没有明确固定起点重点的DAG模型: 嵌套矩形问题:有n个矩形,每个矩形可 ...

  5. UVA 1025 "A Spy in the Metro " (DAG上的动态规划?? or 背包问题??)

    传送门 参考资料: [1]:算法竞赛入门经典:第九章 DAG上的动态规划 题意: Algorithm城市的地铁有 n 个站台,编号为 1~n,共有 M1+M2 辆列车驶过: 其中 M1 辆列车从 1 ...

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

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

  7. DP入门(2)——DAG上的动态规划

    有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 一.DAG模型 [嵌套矩形问题] 问题 ...

  8. 9.2 DAG上的动态规划

    在有向无环图上的动态规划是学习动态规划的基础,很多问题都可以转化为DAG上的最长路,最短路或路径计数问题 9.2.1 DAG模型 嵌套矩形问题: 矩形之间的可嵌套关系是一种典型的二元关系,二元关系可以 ...

  9. DAG 上的动态规划(训练指南—大白书)

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

随机推荐

  1. SpringBoot | 第二十三章:日志管理之整合篇

    前言 在本系列<第四章:日志管理>中,由于工作中日志这块都是走默认配置,也没有深入了解过,因为部署过程中直接使用了linux中的输出重定向功能,如java -jar xx.jar > ...

  2. Unity Download Assistant Error: 'SendRequest Error' while downloading ini file from http://files.unity3d.com/bootstrapper/29055738eb78/unity-5.3.6f1-win.ini

    Unity 官网的哥们如此说道 I open the exe on Compatibility Mode , it's solved. You can try. :) 翻译就是 我用兼容模式打开,就能 ...

  3. sqlserver2008执行200M以上的大脚本文件,打开脚本总是报“未能完成操作,存储空间不足”

    用sqlcmd命令行工具. 1.win7下快捷键:win+R 2.输入cmd​,确定 3.输入命令:sqlcmd -S <数据库> -i C:\<数据文件>.sql 例:sql ...

  4. python中*args, **kwargs理解

    先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '----------- ...

  5. LeetCode(605,581,566)

    LeetCode(605,581,566) 摘要:605盲改通过:581开始思路错误,后利用IDE修改(多重循环跳出方法):566用C语言时需要动态内存分配,并且入口参数未能完全理解,转用C++. 6 ...

  6. Android 使用greenDAO 3.2.2 操作外部数据库

    项目开发中有时需要用到一些写死的数据,如公司的产品信息之类的.这就需要我们先把数据库文件保存在资源文件夹下,然后当应用创建时将数据库文件拷到应用安装目录的/databases/文件夹下,然后再对数据进 ...

  7. 【Android开发笔记】Android Splash Screen 启动界面

    public class SplashActivity extends Activity { @Override protected void onCreate(Bundle savedInstanc ...

  8. TP5.0:的安装与配置

    在网址中输入:localhost/安装TP5的文件夹/public/ 入口文件位置:public/index.php: 最新版本中,新建的文件夹是没有模型和视图的,需要自行添加没有的文件: 添加前: ...

  9. 基于Dockerfile 构建redis5.0.0(包括持久化)及RedisDestopManager 监控

    一 创建Dockerfile [root@zxmrlc docker]# mkdir redis [root@zxmrlc docker]# cd redis && touch Doc ...

  10. Android(java)学习笔记91:Eclipse中代码提示去掉@override,不然就报错!

    1. Eclipse中提示去掉@Override 把项目下载下来后有@Override的注释的方法会报错,如果把@Override去掉就不报错了.经过查阅后发现:@override注释在jdk1.5环 ...