UVa 103 - Stacking Boxes
题目大意:矩阵嵌套,不过维数是多维的。有两个个k维的盒子A(a1, a1...ak), B(b1, b2...bk),若能找到(a1...ak)的一个排列使得ai < 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相关推荐
- UVa 103 - Stacking Boxes(dp求解)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...
- UVA 103 Stacking Boxes
终于完成了啊,这可是我自己独立做的第一道DP题!激动ing--这题在白书里是DAG上的DP,可是我看不懂,比如怎么建图我就不会,所以代码都是自己想的.图我不会建,只好动下脑子,刚开始是想用二维数组保存 ...
- 【DP】UVA 103 Stacking Boxes 输出路径
类似于叠箱子 对于箱子a : (a1,a2,a3),b : (b1,b2,b3) 存在一个顺序ai<bj,ak<bi,aj<bk 就表示a可以到b #include <stdi ...
- 个人DP训练(基础版)
题目链接 hdu 2955 Robberies 01背包,转化为求被抓的概率. 题目链接 hdu 1864 最大报销额 01背包,每张发票的总额为容量和价值,注意预处理数据,对 ...
- π-Algorithmist分类题目(3)
原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(3) Probability ...
- π-Algorithmist分类题目(2)
原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(2) Set Theory U ...
- π-Algorithmist分类题目(1)
原题网站:Algorithmist,http://www.algorithmist.com/index.php/Main_Page π-Algorithmist分类题目(1) Sorting UVAL ...
- 提取了下刘汝佳推荐的题号...
今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started 10055 - Hashmat the Brave Warrior ...
最新文章
- 完全基于Transformer的目标检测器,ICLR匿名论文实现视觉、检测统一
- PageHelper分页插件的原理是什么
- 注解实现原理学习之how does @Category work
- JAVA基础进阶day01
- 进程和线程的本质和区别
- PHP如何实现网址伪静态
- 经典算法——合并两个有序单向链表
- Sublime Text 3 如何配置Python环境及安装插件?
- excel 第六次人口普查_计算机二级考试真题-Excel-第六次人口普查数据的统计分析...
- ERP源码 跨境电商ERP源码 Java电商ERP源码
- 饥荒联机版服务器启动慢_饥荒联机版大型攻略——简介与目录
- Win10下的外接显示器不能识别的解决方法
- RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you
- 《安富莱嵌入式周报》第293期:SEGGER开源其C/C++库源码emRun,丰富EMC电磁兼容资,OTA开源组件,2022 Github全球报告,内存安全指南
- Java Swing实用小工具开发
- 基于arcpy开发arcgis工具
- android中实现录音功能,Android实现录音功能及播放语音功能
- 我的美河视频在线资料
- 域服务器修复,重置 Windows 域目录还原(DRSM)密码
- 100道Python编程题