题面

巴比伦人有n种长方形方块,每种有无限个,第i种方块的三边边长是xi,yi,zi。对于每一个方块,你可以任意选择一面作为底,这样高就随着确定了。举个例子,同一种方块,可能其中一个是竖着放的,一个是侧着放的,一个是横着放的。

他们想要用堆方块的方式建尽可能高的塔。问题是,只有一个方块的底的两条边严格小于另一个方块的底的两条边,这个方块才能堆在另一个上面。这意味着,一个方块甚至不能堆在一个底的尺寸与它一样的方块的上面。

你的任务是编写一个程序,计算出这个塔可以建出的最高的高度。

思路

用结构体记录一块石头的六种放置情况,排序*(后面会讲到为什么排序

用f[i]表示以第i块石头为底的最大高度

那么转移方程很明显了:

f[i]=max(f[i],f[l]+e[i].h) if第l块能放在第i块上面

代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n,f[603],ans,x,y,z,tot,p;
struct node{int c,k,g;
}e[603];
bool cmp(node a,node b){if(a.c==b.c)return a.k<b.k;return a.c<b.c;
}
int main()
{cin>>n;while(n!=0){memset(f,0,sizeof(f));ans=0;memset(e,0,sizeof(e));for(register int i=1;i<=n;i++){cin>>x>>y>>z;e[++tot].c=x,e[tot].k=y,e[tot].g=z;e[++tot].c=x,e[tot].k=z,e[tot].g=y;e[++tot].c=y,e[tot].k=z,e[tot].g=x;e[++tot].c=z,e[tot].k=x,e[tot].g=y;e[++tot].c=z,e[tot].k=y,e[tot].g=x;e[++tot].c=y,e[tot].k=x,e[tot].g=z;}sort(e+1,e+1+tot,cmp);for(register int i=1;i<=tot;i++){f[i]=e[i].g;for(register int l=1;l<=i;l++){if(e[l].c<e[i].c&&e[l].k<e[i].k)f[i]=max(f[i],f[l]+e[i].g);}ans=max(f[i],ans);}printf("Case %d: maximum height = %d\n",++p,ans);cin>>n;     }return 0;
}

总结

最后回想一下为什么要排序

如果不排序

那么这些块的高度就是混乱的

在循环时就会错过一些状态....

UVA437 巴比伦塔 The Tower of Babylon相关推荐

  1. UVA437 巴比伦塔 The Tower of Babylon(矩形嵌套进阶版、DAG上DP、记忆化搜索)

    整理的算法模板合集: ACM模板 本题和基础的矩形覆盖差不多,只不过变成了三维的长方形. 因为每次转移的时候只有顶面的x和y会影响决策的进行,所以我们只需要用一个二元组(a,b)(a, b)(a,b) ...

  2. 【DP】【Uva437】UVA437 The Tower of Babylon

    传送门 Description Input Output Sample Input 1 10 20 30 2 6 8 10 5 5 5 7 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 ...

  3. Uva 437 - The Tower of Babylon(DP)

    题目链接 https://vjudge.net/problem/UVA-437 [题意]        给定n种不同的立方体,每种立方体都有无穷多个,现在要用它们跌放在一起组成一个巴比伦塔,并且处在某 ...

  4. 【UVA 437】The Tower of Babylon(记忆化搜索写法)

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  5. uva437巴比伦塔

    巴比伦人有n种长方形方块,每种有无限个,第i种方块的三边边长是xi,yi,zi.对于每一个方块,你可以任意选择一面作为底,这样高就随着确定了.举个例子,同一种方块,可能其中一个是竖着放的,一个是侧着放 ...

  6. uva437The Tower of Babylon

    题意:给定n个长方体,叠加长方体,规则是上面的长方体长和宽都要小于下面的长方体.每种长方体有无数个,问叠加最高为多少. 分析:dp,递归搜索最大高度.' #include<iostream> ...

  7. uva 437——The Tower of Babylon

    题意:给定n个长方体,然后堆积最高的塔,要求上面的面积小于下面的面积. 思路:Dp,先把长方体的所有放的情况都构造出来放到数组里,对于当前节点,如果能够在前面找到面积比当前小,高度累加比当前高的则转移 ...

  8. 【UVA 437】The Tower of Babylon(拓扑排序+DP,做法)

    [Solution] 接上一篇,在处理有向无环图的最长链问题的时候,可以在做拓扑排序的同时,一边做DP; 设f[i]表示第i个方块作为最上面的最高值; f[y]=max(f[y],f[x]+h[y]) ...

  9. Competitive Programming 3题解

    题目一览: Competitive Programming 3: The New Lower Bound of Programming Contests(1) Competitive Programm ...

  10. UVa在线比赛单题汇总-----DP专题

    动态规划基础 例题 LA 3882 UVa 3882 - And Then There Was One 递推------------无力orz UVa 10635 10635 - Prince and ...

最新文章

  1. Cell:肠道菌群促进帕金森发生ParkinsonDisease
  2. 在 Java 应用程序中使用 Elasticsearch: 高性能 RESTful 搜索引擎和文档存储快速入门指南
  3. c++ linux下读取指定目录的所有文件名字
  4. 数据库原理与应用(SQL Server)笔记 第四章 嵌套查询和其他查询子句
  5. html文字斜体变成正体,$$中的字母如何由斜体变成正体?
  6. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(八)
  7. Linux Workqueue
  8. Atitit. .net c# web 跟客户端winform 的ui控件结构比较
  9. Qt 维护工具MaintenanceTool.exe 使用
  10. 深入理解Nginx负载均衡和反向代理_学习笔记
  11. 点云配准(四) 四元数与旋转变换
  12. 图片优化——质量与性能的博弈
  13. 第十章-系统故障发生,哪些事务需要重做,哪些事务需要回滚
  14. 企业微信和钉钉的区别
  15. Android Studio 学习资料大全
  16. 「深度」比天气还热的无人超市,是真有料还是在玩模式?
  17. H.264编码基础知识详解
  18. 无货源淘宝店铺难做?那是因为一些技巧你没有掌握
  19. 浅谈电商数据分析指标体系
  20. 不格式化U盘拷贝大于4G的文件,把U盘FAT32转换成NTFS格式

热门文章

  1. UnityShader源码2017---学习笔记与自我拓展001
  2. 加拿大麦吉尔大学计算机科学学院,加拿大麦吉尔大学专业:加拿大麦吉尔大学的院校介绍以及专业设置...
  3. 建站系列:有云服务器和域名怎么建设网站?
  4. 什么是CDN加速服务器?
  5. 书单|普通员工到职场精英,这一步怎样跨越?
  6. kafka的Leader选举机制
  7. 是什么撑起了极兔快递近200亿美元的估值?
  8. 重磅!各省市考研网上确认(现场确认)时间一览
  9. 简单做份西红柿炒蛋778
  10. uva1589 Xiangqi