题目:uva103 - Stacking Boxes(DAG)

题目大意:给出N个boxes, 而且给出这些箱子的维度。要求找一个最长的序列。可以使得以下的箱子一定可以有个维度序列大于上面的那个箱子的维度序列。比如:A箱子(2 3 4),B箱子(3 4 5),由于有个序列2 3 4 。 3 4 5使得B每一个维度的值都大于A,所以A可以在B上面 。

解题思路:DAG。将这些箱子哪个能在哪个上面处理出有向图出来,这里推断能否够在上面的情况,仅仅要将这两个箱子的维度都从小到大排下序,然后比較一下是否相应的位置的值要不都比还有一个小就能够了。

比如 :

31 4 18 8 27 17

44 32 13 19 41 19

排序

4 8 17 18 27 31

13 19 19 32 41 44

发现上面的数字比以下的相应位置的数字小。就能够。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 35;
const int M = 15; int n, m;
int box[N][M];
int G[N][N];
int f[N][N];
int path[N][N]; bool judge (int a, int b) { for (int i = 0; i < m; i++)
if (box[a][i] >= box[b][i])
return false;
return true;
} void handle () { memset (G, 0, sizeof (G));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) { if (i == j)
continue;
if (judge(i, j))
G[i][j] = 1;
}
} void init () { for (int i = 0; i <= n; i++)
for (int j = 0; j <= n; j++)
f[i][j] = -1;
} int dp (int x, int y) { int& ans = f[x][y];
int temp;
if (ans != -1)
return ans;
for (int i = 0; i < n; i++)
if (G[y][i]) {
temp = dp(y, i) + 1;
if (temp > ans) {
ans = temp;
path[x][y] = i;
}
}
if (ans == -1) {
ans = 2;
path[x][y] = -1;
}
return ans;
} void printf_ans(int x, int y) { if (path[x][y] == -1)
return;
printf (" %d", path[x][y] + 1);
printf_ans(y, path[x][y]);
} int main () { while (scanf ("%d%d", &n, &m) != EOF) { for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
scanf ("%d", &box[i][j]); for (int i = 0; i < n; i++)
sort (box[i], box[i] + m); handle ();
init(); int ans = 1;
int temp;
int x, y;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (G[i][j]) {
temp = dp(i, j);
if (temp > ans) {
ans = temp;
x = i;
y = j;
}
}
printf ("%d\n", ans);
if (ans != 1) { printf("%d %d", x + 1, y + 1);
printf_ans(x, y);
} else
printf ("1");
printf ("\n");
}
return 0;
}

uva103 - Stacking Boxes(DAG)的更多相关文章

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

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

  2. uva 103 Stacking Boxes(DAG)

    题目连接:103 - Stacking Boxes 题目大意:有n个w维立体, 输出立体互相嵌套的层数的最大值, 并输出嵌套方式, 可嵌套的要求是外层立体的w条边可以分别对应大于内层立体. 解题思路: ...

  3. UVA 103 Stacking Boxes (dp + DAG上的最长路径 + 记忆化搜索)

     Stacking Boxes  Background Some concepts in Mathematics and Computer Science are simple in one or t ...

  4. DAG 模型 stacking boxes 动态规划

    题目:UVA 103 stacking boxes 题目大意: 给你两个数,一个是盒子的个数,一个是每一个盒子的维数.将一个个盒子互相装起来,让你求最多可以装多少个,要求字典序最小. 解析:这个就是盒 ...

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

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

  6. uva 103 Stacking Boxes(最长上升子序列)

    Description    Stacking Boxes  Background Some concepts in Mathematics and Computer Science are simp ...

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

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

  8. UVa 103 - Stacking Boxes

    题目大意:矩阵嵌套,不过维数是多维的.有两个个k维的盒子A(a1, a1...ak), B(b1, b2...bk),若能找到(a1...ak)的一个排列使得ai < bi,则盒子A可嵌套在盒子 ...

  9. UVA 103 Stacking Boxes --LIS

    实际上是一个扩展维度的矩形嵌套问题. 一个物体能嵌入另一个物体中,当且仅当这个物体的所有维度的长度都小于另外一个(本题是小于等于),又因为可以旋转等变换,所以干脆将每个箱子的边从小到大排序,以便于判断 ...

随机推荐

  1. matlab2017a doc 关联注册码

    在 matlab 2017a 的命令行界面,输入doc **查看相关函数的帮助文档时,必须要关联注册码才可使用. 这种显然是在网络连接状况下给出的提示,也即主机处在网络连接状态,试图默认查找的网络中的 ...

  2. java9新特性-1-概述

    经过4次跳票,历经曲折的java 9 终于终于在2017年9月21日发布.       2.哪些人适合看这套视频? 已经熟悉或熟练运用java 8 及 之前 java 版本的开发人员.科研人员.学生及 ...

  3. 关于docker部署javaweb应用的问题

    我做了两个镜像,一个mysql,一个tomcat.建完mysql容器之后,在建tomcat的时候用--link把他们链接起来了进tomcat的容器里面 /etc/hosts 也发现了mysql的ip但 ...

  4. sql 知识点

    1 聚集索引和非聚集索引的区别 聚集索引是指 表中存储的数据按照索引的顺序来存储,数据检索效率高,但是对数据更新影响较大:非聚集索引是数据存储在一个地方,索引存储在另一个地方:索引带有指针,指向数据的 ...

  5. 最短路径—Dijkstra 算法和Floyd 算法

    某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在 ...

  6. bzoj5085: 最大 暴力 二分

    Code: #include<cstdio> #include<algorithm> #include<cstring> #include<iostream& ...

  7. CF245H Queries for Number of Palindromes(回文树)

    题意翻译 题目描述 给你一个字符串s由小写字母组成,有q组询问,每组询问给你两个数,l和r,问在字符串区间l到r的字串中,包含多少回文串. 输入格式 第1行,给出s,s的长度小于5000 第2行给出q ...

  8. Unity UGUI——UI基础,Canvas

    主题:画布--Canvas 内容:创建Canvas UI控件的绘制顺序 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTXJfQUhhbw==/font/5 ...

  9. Objective-C - NSInteger转换NSString

    NSInteger不是对象, 转换为long匹配64位系统, 再组成字符串(%ld). NSString *inStr = [NSString stringWithFormat: @"%ld ...

  10. CSS 相对/绝对(relative/absolute)定位与jQuery的控制显示隐藏

    曾经写显示隐藏老是用jq方法控制: dom.show(); dom.hide(); 事实上这样还是有非常多缺陷的. 这是html结构: <div class="holi"&g ...