有n(n≤30)n(n≤30)n(n≤30)种立方体,每种都有无穷多个。要求选一些立方体摞成一根尽量高的柱子(可以自行选择哪一条边作为高),使得每个立方体的底面长宽分别严格小于它下方立方体的底面长宽。

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;struct node {int x, y, z;void rec(int a, int b, int c) {x = a;y = b;z = c;}
}st[200];int dp[200]; //状态矩阵int cmp(node a, node b) { // 按底面积从小到大排序if (a.x*a.y < b.x * b.y)return 1;return 0;
}
int main() {int n;int x, y, z;int T = 1;while (scanf("%d", &n) && n) {int num = 0;for (int i = 0; i < n; i++) {scanf("%d %d %d", &x, &y, &z);st[num++].rec(x, y, z);st[num++].rec(x, z, y);st[num++].rec(y, z, x);st[num++].rec(y, x, z);st[num++].rec(z, x, y);st[num++].rec(z, y, x);}sort(st, st + num, cmp); // 按底面积排序int ans = 0;// i 作为最下面考虑for (int i = 0; i < num; i++) { // 从底面积最小的立方体开始(i=0边界条件,底面积最小,上面不能再放立方体)dp[i] = st[i].z; // dp[i] 最少为st[i].zfor (int j = 0; j < i; j++) { // 先利用底面积次大的立方体,然后向底面积小的遍历if (st[j].x < st[i].x && st[j].y < st[i].y) //st[j]可以放在st[i]上面dp[i] = max(dp[i], dp[j] + st[i].z); // 如果底面积较小的dp[j]加上当前st[i].z大于dp[i],则dp[i]记录为前者if (dp[i] > ans)ans = dp[i]; // 记录dp中最大的}}printf("Case %d: maximum height = %d\n", T++, ans);}return 0;
}

或者

#include <stdio.h>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;const int maxn = 200;
int n, num;
bool g[maxn][maxn];
int dp[maxn];struct node {int x, y, z;void f(int a, int b, int c) {x = a;y = b;z = c;}
}st[200];
bool check(int i, int j) {if (st[i].x < st[j].x && st[i].y < st[j].y || (st[i].y < st[j].x && st[i].x < st[j].y))return true;return false;
}
int d(int k) {// k 作为最上面考虑if (dp[k] != -1)return dp[k];dp[k] = st[k].z; // dp[k] 至少为st[k].zfor (int i = 0; i < num; i++) // 没有预先排序,遍历所有if (g[k][i]) // i可以放在k下面dp[k] = max(dp[k], d(i) + st[k].z); //i可以放在k下面,所以选出d(i)加上当前的st[k].z中最大的return dp[k];
}
int main() {int n;int x, y, z;int T = 1;while (scanf("%d", &n) && n) {num = 0;for (int i = 0; i < n; i++) {scanf("%d %d %d", &x, &y, &z);st[num++].f(x, y, z);st[num++].f(x, z, y);st[num++].f(y, z, x);}memset(g, 0, sizeof(g));for (int i = 0; i < num; i++) {for (int j = i + 1; j < num; j++) {g[i][j] = check(i, j);g[j][i] = check(j, i);}}int ans = 0;memset(dp, -1, sizeof(dp));for (int i = 0; i < num; i++)ans = max(ans, d(i)); // 找出dp中最大值printf("Case %d: maximum height = %d\n", T++, ans);}return 0;
}

27.巴比伦塔(UVa 437)相关推荐

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

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

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

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

  3. uva 437——The Tower of Babylon

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

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

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

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

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

  6. C语言里 指针变量强制类型转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  7. DP(动态规划)总结

    1. 写在前面的话 之前写了一篇不像总结的动态规划总结,感觉更像是一个成长历程,所以就打算重写一篇. 2. 对DP简单的总结 dp的题目特点 求最大或者最小值(如背包:价值最大.凑硬币:数量最少--) ...

  8. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  9. uva 401.Palindromes

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

  10. UVa 10112 - Myacm Triangles

    UVa第一卷最后一题. 求内部不含点并且面积最大的三角形. 暴力. 代码如下: 1 #include<iostream> 2 #include<cstdio> 3 #inclu ...

最新文章

  1. 博客园----你真的没有没落.感恩博客园。。。
  2. Linux查看历史信息代码,使用 GIT 获得Linux Kernel的代码并查看,追踪历史记录
  3. PHP----------PHP自身的性能优化注意事项
  4. DL中版本配置问题:TensorFlow、Keras、Python版本完美搭配推荐
  5. 华中科技大学应用高等工程数学_专业解析【第152期】| 机械电子工程课程设置及研究方向...
  6. 开始学java咯!~~~
  7. 使用TortoiseGit提交代码到Github.com上 详细步骤
  8. php的mktime,PHP mktime()函数获得本地时间戳
  9. vSphere 7 With K8s系列09:部署wordpress示例
  10. BTREE这种Mysql默认的索引方式,具有普遍的适用性
  11. 拼多多业绩增长难继,品牌形象陷于信任危机
  12. 中信所怎么查期刊影响因子_中华细胞与干细胞杂志影响因子
  13. 从外包公司到今日头条offer,吐血整理
  14. python 日程(待办事项) 提醒简单小程序——基于Timer和tkinter
  15. 视频消重入门级,学会这个你基本就能靠搬运维持生活自媒体视频如何消重?批量处理去重消重去水印去logo...
  16. STM32超低功耗入门之停止模式
  17. oracle触发器报错语法,Oracle 触发器
  18. 从Node.js访问文件系统
  19. Eviews软件工具——线性回归模型(超详细版本)
  20. 塑料注塑模具质量等级分类,质量不过剩很重量!

热门文章

  1. 转 适合wince初学者的一些 知识
  2. np.take()函数用法 python numpy
  3. Photoshop抠图教程(超详细)
  4. 用html制作一个网站的步骤,新手怎么做网页 新手如何制作一个网页
  5. 用Excel做了7天报表,这个领导喜欢的可视化工具,只用了7小时
  6. pr中小人国微缩世界,速度快门的变化,动态地图,手写文字效果,打字机输入文字,照片定格效果
  7. python中numpy中的shape和get_shape解析
  8. 神奇的css之 -webkit-background-clip: text; 五彩斑斓的文字效果
  9. EL表达式与JSTL标签库
  10. Android投屏神器scrcpy