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)是图上的一条边。最后就是打印路径,根据转移方程递归打印路径即可。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define BOXN 35
#define DIMENSION 12 int k, n; // k is the number of boxes, n is the dimensionality
int box[BOXN][DIMENSION], d[BOXN]; // d[i] save the number of nodes in the longest path starting with node i
int G[BOXN][BOXN]; bool is_nested(int *box1, int *box2)
{
// if box1 can be nested in box2, return true; otherwise false
for (int i = ; i < n; i++)
if (box1[i] >= box2[i]) return false;
return true;
} int dp(int i) // compute d[i]
{
if (d[i] > ) return d[i];
d[i] = ;
for (int j = ; j <= k; j++)
if (G[i][j])
d[i] = max(d[i], dp(j)+);
return d[i];
} void print_path(int i) // print the longest path starting with node i
{
printf("%d ", i);
for (int j = ; j <= k; j++)
if (G[i][j] && d[i] == d[j]+)
{
print_path(j);
break;
}
} int main()
{
#ifdef LOCAL
freopen("in", "r", stdin);
#endif
while (scanf("%d%d", &k, &n) != EOF)
{
for (int i = ; i <= k; i++)
for (int j = ; j < n; j++)
scanf("%d", &box[i][j]);
for (int i = ; i <= k; i++)
sort(box[i], box[i]+n);
memset(G, , sizeof(G));
for (int i = ; i <= k; i++)
for (int j = ; j <= k; j++)
if (is_nested(box[i], box[j]))
G[i][j] = ;
int ans = -;
int start = ;
memset(d, , sizeof(d));
for (int i = ; i <= k; i++)
{
int t = dp(i);
if (t > ans)
{
ans = t;
start = i;
}
}
printf("%d\n", ans);
print_path(start);
printf("\n");
}
return ;
}
UVa 103 - Stacking Boxes的更多相关文章
- UVa 103 Stacking Boxes --- DAG上的动态规划
UVa 103 题目大意:给定n个箱子,每个箱子有m个维度, 一个箱子可以嵌套在另一个箱子中当且仅当该箱子的所有的维度大小全部小于另一个箱子的相应维度, (注意箱子可以旋转,即箱子维度可以互换),求最 ...
- uva 103 Stacking Boxes(DAG)
题目连接:103 - Stacking Boxes 题目大意:有n个w维立体, 输出立体互相嵌套的层数的最大值, 并输出嵌套方式, 可嵌套的要求是外层立体的w条边可以分别对应大于内层立体. 解题思路: ...
- UVa 103 - Stacking Boxes(dp求解)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- 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 (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 --LIS
实际上是一个扩展维度的矩形嵌套问题. 一个物体能嵌入另一个物体中,当且仅当这个物体的所有维度的长度都小于另外一个(本题是小于等于),又因为可以旋转等变换,所以干脆将每个箱子的边从小到大排序,以便于判断 ...
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...
随机推荐
- subversion javahl
新建android项目时,总是说"javahl, require version 1.8"云云. dpkg -l | grep libsvn-java1.6 apt-get upd ...
- Android开发实现HttpClient工具类
在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务.你可以把HttpClient想 ...
- mob分享
QQ分享时候 QQ和QQ控件的appid 是一样的 都是在QQ开发者那里申请 powered by ShareSDK怎么去掉? android:参考sdk说明文档,继承一个AuthorizeAd ...
- 生成Token字符串
生成比较短的Token字符串 有的时候,我们需要生成一些Token作为标识:如认证后的标识符,资源的提取码等.一个比较常见的算法是生成一个GUID来作为Token,由于GUID的随机性和唯一性特点,作 ...
- CASpringAnimation
iOS9新出现的 /** Subclass for mass-spring animations. */ @interface CASpringAnimation : CABasicAnimation ...
- 深入浅出Ajax(三)
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...
- Posix消息队列实现机制
本文是对<Unix 网络编程 卷2:进程通信>的笔记. 引言 消息队列是进程间通信的一种方式,可是如果不理解他的实现原理,会有众多不理解之处,下面就结合本书中的例子,对posix消息队列来 ...
- SUSE Linux Enterprise Server 11 SP1安装图解教程
一.说明:操作系统:SUSE Linux Enterprise Server 11 SP1下载地址:需要注册才能下载二.安装系统 用启动盘成功引导之后,出现下面的界面 系统运维 温馨提醒:qihang ...
- USACO1.3.4 Combination Lock
题目链接:1.3.4 为了防止有重复的数字,我开了个三维数组来标记,爆内存,又用vector标记,爆内存... 不得不感慨这份代码. /* ID:wang9621 PROG:combo LANG:C+ ...
- 【转】简单模拟angular的依赖注入
原文:http://www.oschina.net/code/snippet_1181081_35136 代码片段 var angular = function(){}; Object.defineP ...