题目大意:矩阵嵌套,不过维数是多维的。有两个个k维的盒子A(a1, a1...ak), B(b1, b2...bk),若能找到(a1...ak)的一个排列使得a< bi,则盒子A可嵌套在盒子B中。给出n个k维的盒子,找出最长的可嵌套的盒子的序列。实际上是DAG上的动态规划问题。首先是判断A能否嵌套在B中,对盒子的k维数进行排序,依次比较即可。然后用d[i]表示以节点i为起点的最长路径的长度,可以得到状态转移方程:d(i) = max{d(j)+1}, (i,j)是图上的一条边。最后就是打印路径,根据转移方程递归打印路径即可。

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 #define BOXN 35
 6 #define DIMENSION 12
 7
 8 int k, n;    // k is the number of boxes, n is the dimensionality
 9 int box[BOXN][DIMENSION], d[BOXN];    // d[i] save the number of nodes in the longest path starting with node i
10 int G[BOXN][BOXN];
11
12 bool is_nested(int *box1, int *box2)
13 {
14     // if box1 can be nested in box2, return true; otherwise false
15     for (int i = 0; i < n; i++)
16         if (box1[i] >= box2[i])   return false;
17     return true;
18 }
19
20 int dp(int i)    // compute d[i]
21 {
22     if (d[i] > 0)   return d[i];
23     d[i] = 1;
24     for (int j = 1; j <= k; j++)
25         if (G[i][j])
26             d[i] = max(d[i], dp(j)+1);
27     return d[i];
28 }
29
30 void print_path(int i)    // print the longest path starting with node i
31 {
32     printf("%d ", i);
33     for (int j = 1; j <= k; j++)
34         if (G[i][j] && d[i] == d[j]+1)
35         {
36             print_path(j);
37             break;
38         }
39 }
40
41 int main()
42 {
43 #ifdef LOCAL
44     freopen("in", "r", stdin);
45 #endif
46     while (scanf("%d%d", &k, &n) != EOF)
47     {
48         for (int i = 1; i <= k; i++)
49             for (int j = 0; j < n; j++)
50                 scanf("%d", &box[i][j]);
51         for (int i = 1; i <= k; i++)
52             sort(box[i], box[i]+n);
53         memset(G, 0, sizeof(G));
54         for (int i = 1; i <= k; i++)
55             for (int j = 1; j <= k; j++)
56                 if (is_nested(box[i], box[j]))
57                     G[i][j] = 1;
58         int ans = -1;
59         int start = 0;
60         memset(d, 0, sizeof(d));
61         for (int i = 1; i <= k; i++)
62         {
63             int t = dp(i);
64             if (t > ans)
65             {
66                 ans = t;
67                 start = i;
68             }
69         }
70         printf("%d\n", ans);
71         print_path(start);
72         printf("\n");
73     }
74     return 0;
75 }
76         

View Code

转载于:https://www.cnblogs.com/xiaobaibuhei/p/3193100.html

UVa 103 - Stacking Boxes相关推荐

  1. UVa 103 - Stacking Boxes(dp求解)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

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

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

  3. UVA 103 Stacking Boxes

    终于完成了啊,这可是我自己独立做的第一道DP题!激动ing--这题在白书里是DAG上的DP,可是我看不懂,比如怎么建图我就不会,所以代码都是自己想的.图我不会建,只好动下脑子,刚开始是想用二维数组保存 ...

  4. 【DP】UVA 103 Stacking Boxes 输出路径

    类似于叠箱子 对于箱子a : (a1,a2,a3),b : (b1,b2,b3) 存在一个顺序ai<bj,ak<bi,aj<bk 就表示a可以到b #include <stdi ...

  5. 个人DP训练(基础版)

    题目链接    hdu 2955 Robberies 01背包,转化为求被抓的概率. 题目链接       hdu   1864  最大报销额 01背包,每张发票的总额为容量和价值,注意预处理数据,对 ...

  6. π-Algorithmist分类题目(3)

    原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(3) Probability ...

  7. π-Algorithmist分类题目(2)

    原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(2) Set Theory U ...

  8. π-Algorithmist分类题目(1)

    原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(1) Sorting UVAL ...

  9. 提取了下刘汝佳推荐的题号...

    今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started    10055 - Hashmat the Brave Warrior ...

最新文章

  1. 完全基于Transformer的目标检测器,ICLR匿名论文实现视觉、检测统一
  2. PageHelper分页插件的原理是什么
  3. 注解实现原理学习之how does @Category work
  4. JAVA基础进阶day01
  5. 进程和线程的本质和区别
  6. PHP如何实现网址伪静态
  7. 经典算法——合并两个有序单向链表
  8. Sublime Text 3 如何配置Python环境及安装插件?
  9. excel 第六次人口普查_计算机二级考试真题-Excel-第六次人口普查数据的统计分析...
  10. ERP源码 跨境电商ERP源码 Java电商ERP源码
  11. 饥荒联机版服务器启动慢_饥荒联机版大型攻略——简介与目录
  12. Win10下的外接显示器不能识别的解决方法
  13. RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you
  14. 《安富莱嵌入式周报》第293期:SEGGER开源其C/C++库源码emRun,丰富EMC电磁兼容资,OTA开源组件,2022 Github全球报告,内存安全指南
  15. Java Swing实用小工具开发
  16. 基于arcpy开发arcgis工具
  17. android中实现录音功能,Android实现录音功能及播放语音功能
  18. 我的美河视频在线资料
  19. 域服务器修复,重置 Windows 域目录还原(DRSM)密码
  20. 100道Python编程题

热门文章

  1. android平板 竖屏,【报Bug】Android平板横屏底部有白边
  2. 家用计算机是数模混合,计算机可分为哪几类?依据是什么?
  3. idea buildConfig_idea打包安卓app
  4. 某程序丢失xinput1_1.dll文件如何解决?
  5. php 文件夹打包_php将文件夹打包成zip文件
  6. madVRhdrMeasure的安装方法
  7. 滴滴杜欢:大型微服务框架设计实践
  8. InputStreamReader读数据的2种方式
  9. 华为ensp-telent设置及vlan设置
  10. 618大战:5G推机潮和5G换机潮的冲突