UVa 103 Stacking Boxes --- DAG上的动态规划
题目大意:给定n个箱子,每个箱子有m个维度,
一个箱子可以嵌套在另一个箱子中当且仅当该箱子的所有的维度大小全部小于另一个箱子的相应维度,
(注意箱子可以旋转,即箱子维度可以互换),求最多能套几个箱子。
第一行输入为n,m,之后是n行m维的箱子
解题思路:嵌套关系是二元关系,因此这题即在DAG上做动态规划,
只不过将二维的判断改成了n维,其他不变。
详细看考:DAG上的动态规划之嵌套矩形 (ps:这题可以理解成嵌套m边形)
/* UVa 103 Stacking Boxes --- DAG上的动态规划 */
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int n, m; //n为结点数,m为维度(n <= 30, m <= 10)
int G[][]; //DAG, G[i][j]为1表示 盒子i可以嵌套在盒子j中
int vec[][];
int dp[]; //判断x是否小于y
bool is_small(int x, int y){
for (int i = ; i <= m; ++i){
//有一个大于等于则返回0
if (vec[x][i] >= vec[y][i]){
return ;
}
}//for(i)
return ;
} void CMAX(int&x, int y){
if (y > x){
x = y;
}
} int DP(int i){
int &ans = dp[i];
if (ans > ){
//记忆化搜索,避免重复计算
return ans;
}
ans = ;
for (int j = ; j <= n; ++j){
if (G[i][j]){
//递归求解
CMAX(ans, DP(j) + );
}
}//for(j)
return ans;
} //输出序列
void print_ans(int i){
if (dp[i] == ){
//最后一个节点了
printf("%d", i);
}
else{
for (int j = ; j <= n; ++j){
if (G[i][j] && dp[j] + == dp[i]){
printf("%d ", i);
print_ans(j);
break;
}
}//for(j)
}
} int main()
{
#ifdef _LOCAL
freopen("D:\\input.txt", "r", stdin);
#endif
while (scanf("%d%d", &n, &m) == ){
for (int i = ; i <= n; ++i){
for (int j = ; j <= m; ++j){
scanf("%d", vec[i] + j);
}//for(j)
sort(vec[i] + , vec[i] + m + );
}//for(i) //建DAG
memset(G, , sizeof G);
for (int i = ; i <= n; ++i){
for (int j = ; j <= n; ++j){
//G[i][j]为1表示盒子i可以嵌套在盒子j中
if (is_small(i, j)){
G[i][j] = ;
}
}//for(j)
}//for(i) //求最长路径
int ans = ;
int best;
memset(dp, , sizeof dp);
for (int i = ; i <= n; ++i){
if (DP(i) > ans){
ans = dp[i];
best = i;
}
}//for(i)
printf("%d\n", ans);
print_ans(best);
printf("\n");
}//while(scanf) return ;
}
UVa 103 Stacking Boxes --- DAG上的动态规划的更多相关文章
- uva 103 Stacking Boxes(DAG)
题目连接:103 - Stacking Boxes 题目大意:有n个w维立体, 输出立体互相嵌套的层数的最大值, 并输出嵌套方式, 可嵌套的要求是外层立体的w条边可以分别对应大于内层立体. 解题思路: ...
- UVa 103 - Stacking Boxes
题目大意:矩阵嵌套,不过维数是多维的.有两个个k维的盒子A(a1, a1...ak), B(b1, b2...bk),若能找到(a1...ak)的一个排列使得ai < bi,则盒子A可嵌套在盒子 ...
- UVA 103 Stacking Boxes (dp + DAG上的最长路径 + 记忆化搜索)
Stacking Boxes Background Some concepts in Mathematics and Computer Science are simple in one or t ...
- UVa 103 - Stacking Boxes(dp求解)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- UVa 103 - Stacking Boxes (LIS,打印路径)
链接:UVa 103 题意:给n维图形,它们的边长是{d1,d2,d3...dn}, 对于两个n维图形,求满足当中一个的全部边长 依照随意顺序都一一相应小于还有一个的边长,这种最长序列的个数,而且打 ...
- UVA 103 Stacking Boxes n维最长上升子序列
题目链接:UVA - 103 题意:现有k个箱子,每个箱子可以用n维向量表示.如果一个箱子的n维向量均比另一个箱子的n维向量大,那么它们可以套接在一起,每个箱子的n维向量可以互相交换值,如箱子(2,6 ...
- uva 103 Stacking Boxes(最长上升子序列)
Description Stacking Boxes Background Some concepts in Mathematics and Computer Science are simp ...
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...
- UVA 103 Stacking Boxes --LIS
实际上是一个扩展维度的矩形嵌套问题. 一个物体能嵌入另一个物体中,当且仅当这个物体的所有维度的长度都小于另外一个(本题是小于等于),又因为可以旋转等变换,所以干脆将每个箱子的边从小到大排序,以便于判断 ...
随机推荐
- HDU 4548
题意: 给你一个区间,问你这个区间中的数既是素数又是美素数的数有多少个?美素数:首先这个数本身必须是素数并且它的各位数字的和也是素数; 如29,本身是素数, 而且2+9 = 11也是素数, 所以它是美 ...
- 学好C++必须要注意的十八个问题
转自 http://blog.chinaunix.net/uid-7396260-id-2056691.html 一.#include "filename.h"和#i nclud ...
- [转] lib和dll 区别,生成及使用方法
lib 和 dll 的区别.生成以及使用详解 [目录] lib dll介绍 生成动态库 调用动态库 生成静态库 调用静态库 首先介绍一下静态库(静态链接库).动态库(动态链接库)的概念,首先两者都是代 ...
- 解决maven Generating project in Interactive mode卡死问题(转)
原文链接:http://blog.csdn.net/only_wan/article/details/52975760 mvn 创建时在generating project in interactiv ...
- 速度!!!抢KIS英文版(多设备版)3年激活码
活动地址 http://promo.kaspersky.com/wvu直接打不开,需要用 US 的 在 线 代 理,暂时提供1个(204.12.228.235)可以绕过第一步邮箱验证注意:3年版多设备 ...
- JS 数组去重!!!
var arr = [1,2,3,1,1,1,3,5,3,6,2]; var newArr=[]; for(var i = 0; i < arr.length-1; i++){ var onOf ...
- JS 跨域问题浅析及解决方法优缺点对比(转)
1.所谓 JS 跨域问题,是指在一个域下的页面中通过js访问另一个不同域下 的数据对象, 出于安全性考 虑,几乎所有浏览器都不允许这种跨域访问,这就导致在一些ajax应用中, 使用跨域的web ser ...
- mysql 创建存储过程注意
最近在利用navicat创建存储过程时,总是报1064语法错误,而且每次都是指向第一行,百思不得姐,如下图: 后来发现,原来是输入参数没有定义长度导致,所以以后真要注意 加上入参长度即可:IN `sT ...
- Android SurfaceView vs TextureView
Android SurfaceView vs TextureView https://github.com/crosswalk-project/crosswalk-website/wiki/Andro ...
- Wythoff's game
这个问题就是OJ题里出现的取石子游戏,http://en.wikipedia.org/wiki/Wythoff%27s_game. 维基里面的通项公式并不适用于算法求解.需要理解下面两条规律: 1.A ...