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
实际上是一个扩展维度的矩形嵌套问题. 一个物体能嵌入另一个物体中,当且仅当这个物体的所有维度的长度都小于另外一个(本题是小于等于),又因为可以旋转等变换,所以干脆将每个箱子的边从小到大排序,以便于判断 ...
随机推荐
- Session初识
web服务器没有短期记忆,所以需要使用session来跟踪用户的整个会话活动.会话管理有3种解决方案: 1)使用隐藏域(很少使用) 在显示页面中使用隐藏域来保存会话ID.例如,在JSP中将input标 ...
- ToolBar+DrawerLayout + NavigationView
http://www.jianshu.com/p/9471b87f2c61 很好的博客可以瞅瞅 <android.support.design.widget.NavigationView and ...
- C语言中的getchar和putchar详解
首先给出<The_C_Programming_Language>这本书中的例子: #include <stdio.h> int main(){ int c; c ...
- windows8.1 plsql连接oracle
http://pan.baidu.com/share/link?shareid=3782452820&uk=3557941237 http://pan.baidu.com/share/link ...
- git vs svn
http://www.tuicool.com/articles/e2MnAb Git与SVN的不同之处 svn为集中化的版本控制,svn获取最新的版本或者提交更新,历史记录等信息每次都要连接中央版本库 ...
- Java私有构造器
Java私有构造器:使用private关键字声明的构造函数.由于类的构造函数时私有的,所以此类不能被实例化,同时也不能被继承.<Effective Java>第三条:用私有构造器或者枚举强 ...
- HDU4055 - number string(DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4055 思路:dp[i][j]表示处理前i个字符以j结尾可能的序列数. 当a[i]=='I'时,dp[i ...
- Windows系统定时重开或者关机
at 6:00 /every:M,T,W,Th,F,S,Su cmd /c shutdown -r -t 60 (每天早上6点自动重启一次) at 0:00 /every:M,T,W,Th,F,S,S ...
- ASP.NET获取客户端及服务器的信息
客户端信息: 1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取客户端电脑名:Page.Request.Us ...
- 推荐mysql优化的21条经验
1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这 1. 为查询缓存优 ...