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

时间:2022-09-04 21:07:14

  

  UVa 103

  题目大意:给定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上的动态规划的更多相关文章

  1. uva 103 Stacking Boxes(DAG)

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

  2. UVa 103 - Stacking Boxes

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

  3. UVA 103 Stacking Boxes &lpar;dp &plus; DAG上的最长路径 &plus; 记忆化搜索&rpar;

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

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

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

  5. UVa 103 - Stacking Boxes &lpar;LIS,打印路径&rpar;

    链接:UVa 103 题意:给n维图形,它们的边长是{d1,d2,d3...dn},  对于两个n维图形,求满足当中一个的全部边长 依照随意顺序都一一相应小于还有一个的边长,这种最长序列的个数,而且打 ...

  6. UVA 103 Stacking Boxes n维最长上升子序列

    题目链接:UVA - 103 题意:现有k个箱子,每个箱子可以用n维向量表示.如果一个箱子的n维向量均比另一个箱子的n维向量大,那么它们可以套接在一起,每个箱子的n维向量可以互相交换值,如箱子(2,6 ...

  7. uva 103 Stacking Boxes&lpar;最长上升子序列&rpar;

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

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

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

  9. UVA 103 Stacking Boxes --LIS

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

随机推荐

  1. C语言程序设计第5堂作业

    一.本次课学习主要内容及知识结构点: 二.实验内容:(60分) 1. 求奇数和.输入一批正整数(以零或负数为结束标志),求其中的奇数和.试编写相应程序. 2. 展开式求和.输入一个实数 x,计算并输出 ...

  2. Linux下JDK、Tomcat

    1.JDK的安装   1. 下载JDK 先查看Linux系统是多少位(32位/64位):getconf  LONG_BIT.再从JDK官网(http://www.oracle.com/technetw ...

  3. Pechkin:html -&gt&semi; pdf 利器

    Pechkin 是GitHub上的一个开源项目,可方便将html转化成pdf文档,使用也很方便,下面是winform项目中的示例代码: using System; using System.Diagn ...

  4. hibernate&period;properties官方属性用例&lpar;可用于hibernate&period;cfg&period;xml属性参考&rpar;

    ######################### Query Language ######################### ## define query language constant ...

  5. CSS3之边框图片border-image

    CSS3中有关border的属性,还有很多,今天我将为大家介绍一个很好玩的属性——Border-image.有了CSS3之边框图片Border-image,我们可以轻松搞定圆角,轻松搞定很多之前难搞的 ...

  6. ASP&period;NET设计模式(一)、适配器模式、依赖注入依赖倒置、空对象模式

    鸟随凤鸾,人伴贤良,得以共之,我之幸也.说的是鸟随着鸾凤可以飞的更高远,人和比自己境界高的相处,自己也会得到熏染进步. 一.概述 分享出来简单的心得,望探讨 依赖倒置 依赖注入 Adapter模式 N ...

  7. WMDestroy函数调用inherited,难道是为了调用子类覆盖函数?还有这样调用的?

    又碰到了: procedure TWinControl.WMDestroy(var Message: TWMDestroy); begin inherited; // important7 fixme ...

  8. 在YouCompleteMe&plus;Syntastic中添加和取消对C&plus;&plus;11的支持

    添加对c++11的支持: /.vimrc中添加: let g:syntastic_cpp_compiler = 'g++'  "change the compiler to g++ to s ...

  9. 从零开始学习前端JAVASCRIPT — 4、JavaScript基础Math和Date对象的介绍

    Math对象的介绍 1:Math对象 Math 对象用于执行数学任务.并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math().您无需创建它,通过把 Math 作为对象使用就 ...

  10. oracle中查询用户信息

    1.查看所有用户: select * from dba_users; select * from all_users; select * from user_users; 2.查看用户或角色系统权限( ...