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
实际上是一个扩展维度的矩形嵌套问题. 一个物体能嵌入另一个物体中,当且仅当这个物体的所有维度的长度都小于另外一个(本题是小于等于),又因为可以旋转等变换,所以干脆将每个箱子的边从小到大排序,以便于判断 ...
随机推荐
- 关于Tcp,为什么一定要进行三次握手呢?
主要是防止已经失效的请求报文段突然又传送到了服务端而产生的连接的误判. 考虑如下的情况:客户端发送了一个连接请求报文段到服务端,但是在某些网络节点上长时间滞留了,而后客户端又超时重发了一个连接请求报文 ...
- 关于jquery.bind
随着现在JQuery这个javascript的越来越强大,在我们平常的前端UI开发,如果不使用JQuery,说明你已经很out了.今天我们来学习一下 JQuery的bind事件.虽然,这个话题被很 ...
- hdu4417 划分树+二分
//Accepted 14796 KB 453 ms //划分树 //把查询的次数m打成n,也是醉了一晚上!!! //二分l--r区间第k大的数和h比较 #include <cstdio> ...
- 2016-1-6第一个完整APP 私人通讯录的实现 4:编辑联系人
一:建立编辑联系人的controller,并使其拥有模型contact,且有协议.代码如下 #import <UIKit/UIKit.h> #import "contact.h& ...
- The constness of a method should makes sense from outside the object
C++的encapsulation机制使得我们可以使得一个类的逻辑接口和内部表示有很大的差异,比如下面这个矩形类: class Rectangle { public: int width() cons ...
- 算法导论 第六章 思考题 6-3 d叉堆
d叉堆的实现相对于二叉堆变化不大,首先看它如何用数组表示. 考虑一个索引从1开始的数组,一个结点i最多可以有d个子结点,编号从id - (d - 2) 到 id + 1. 从而可以知道一个结点i的父结 ...
- 黑马程序员——【Java基础】——面向对象(二)异常机制、包(Package)
---------- android培训.java培训.期待与您交流! ---------- 一.异常机制 (一)异常概述 1.异常:就是程序在运行时出现不正常情况. 2.异常类:程序在运行时,出现的 ...
- 调度 Quartz 时间格式配置
1. CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年]
- Mac OS环境变量配置(Android Studio之Gradle)
以gradle环境变量配置为例: Android Studio 自带的gradle路径为: /Applications/Android\ Studio.app/Contents/gradle/grad ...
- UINavigationController的使用(多视图控制器)
一,重点 当视图控制器控制多视图时,所有页都有导航栏,如果我们有的页面不希望有导航栏咋办?网上没有搜索到结果,我探索到之后发表于此: [super navigationController].navi ...