UVa 437 巴比伦塔(The Tower of Babylon)
分析:
一个立方体可能有三种高,因此一个立方体可以当三个立方体用,因为立方体是不限数量的
这个时候可以构建一个有向图,在O(n^2)内判断正方体的有向边,利用have_edge判断一个正方体
是否可以放在另一个正方体之上,然后就dp就可以了,dp的状态是
ans = max(dp[j][w] + rec[i][j].h, ans) 这里的ans是已经加好当前这个立方体高度的dp[i][j]
这个转移方程的意思是, 当前最高高度等于可以放上j, w(j, w可以取任意have_edge的正方体)这个立方体(但还没放上)的高度的最大值
当然也可以用放上写dp, 那状态可能更清晰点
如果是放上的话,那没有边应该return 0, 且一开始就应该加上第一个正方体的高度。
这个等读者自行理解。
这里要注意记忆化,否则会超时。
d[i][j] 表示以 i , j, 为正方形底部,可以达到的最大高度。
#include<bits/stdc++.h>
#define LL long long
#define ms(s) memset(s, 0, sizeof(s))
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define INF 0X7fffffff
using namespace std;
const int maxn = 100;struct Rec {int x, y, z;Rec(int x, int y, int z) : x(x), y(y), z(z) {}Rec() {}
}rec[maxn][3];int d[maxn][3];
bool have_edge[maxn][3][maxn][3];
int n;int dp(int i, int k) {int& ans = d[i][k];if (ans != -1) return ans;ans = rec[i][k].z;for (int j = 1; j <= n; j++) {for (int w = 0; w <= 2; w++) {if (have_edge[i][k][j][w]) {ans = max(ans, dp(j, w) + rec[i][k].z);}}}return ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);ios::sync_with_stdio(false);cin.tie(0);int kase = 0;while (cin >> n && n) {for (int i = 1; i <= n; i++) {cin >> rec[i][0].x >> rec[i][0].y >> rec[i][0].z;rec[i][1].x = rec[i][0].y; rec[i][1].y = rec[i][0].z;rec[i][1].z = rec[i][0].x; rec[i][2].x = rec[i][0].z;rec[i][2].y = rec[i][0].x; rec[i][2].z = rec[i][0].y;}memset(d, -1, sizeof(d));ms(have_edge);for (int i = 1; i <= n; i++) {for (int k = 0; k <= 2; k++) {for (int j = 1; j <= n; j++) {for (int w = 0; w <= 2; w++) {if ((rec[i][k].x > rec[j][w].x && rec[i][k].y > rec[j][w].y)||(rec[i][k].x > rec[j][w].y && rec[i][k].y > rec[j][w].x))have_edge[i][k][j][w] = true;}}}}int ans = -1;for (int i = 1; i <= n; i++) {for (int k = 0; k <= 2; k++) {ans = max(ans, dp(i, k));}}//Case 1: maximum height =std::cout << "Case " << ++kase << ": maximum height = ";std::cout << ans << endl;}return 0;
}
UVa 437 巴比伦塔(The Tower of Babylon)相关推荐
- 【UVA 437】The Tower of Babylon(记忆化搜索写法)
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【UVA 437】The Tower of Babylon(拓扑排序+DP,做法)
[Solution] 接上一篇,在处理有向无环图的最长链问题的时候,可以在做拓扑排序的同时,一边做DP; 设f[i]表示第i个方块作为最上面的最高值; f[y]=max(f[y],f[x]+h[y]) ...
- UVA437 巴比伦塔 The Tower of Babylon(矩形嵌套进阶版、DAG上DP、记忆化搜索)
整理的算法模板合集: ACM模板 本题和基础的矩形覆盖差不多,只不过变成了三维的长方形. 因为每次转移的时候只有顶面的x和y会影响决策的进行,所以我们只需要用一个二元组(a,b)(a, b)(a,b) ...
- Uva 437 - The Tower of Babylon(DP)
题目链接 https://vjudge.net/problem/UVA-437 [题意] 给定n种不同的立方体,每种立方体都有无穷多个,现在要用它们跌放在一起组成一个巴比伦塔,并且处在某 ...
- uva 437——The Tower of Babylon
题意:给定n个长方体,然后堆积最高的塔,要求上面的面积小于下面的面积. 思路:Dp,先把长方体的所有放的情况都构造出来放到数组里,对于当前节点,如果能够在前面找到面积比当前小,高度累加比当前高的则转移 ...
- uva437The Tower of Babylon
题意:给定n个长方体,叠加长方体,规则是上面的长方体长和宽都要小于下面的长方体.每种长方体有无数个,问叠加最高为多少. 分析:dp,递归搜索最大高度.' #include<iostream> ...
- 【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 ...
- UVa在线比赛单题汇总-----DP专题
动态规划基础 例题 LA 3882 UVa 3882 - And Then There Was One 递推------------无力orz UVa 10635 10635 - Prince and ...
- C语言里 指针变量强制类型转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
- DP(动态规划)总结
1. 写在前面的话 之前写了一篇不像总结的动态规划总结,感觉更像是一个成长历程,所以就打算重写一篇. 2. 对DP简单的总结 dp的题目特点 求最大或者最小值(如背包:价值最大.凑硬币:数量最少--) ...
最新文章
- epoch如何设置_使用TFRecordDataset时如何设置epoch计数器?
- 助你进大厂,这些Mysql索引底层知识你是必须知道的。
- 中科大提出统一输入过滤框架InFi:首次理论分析可过滤性,支持全数据模态
- 解决报错:import sun.misc.BASE64Decoder无法找到
- 实用代码---取得当前的年月日,当前的时分秒获得,周几和星期几获得
- mybatis mysql demo_SpringBoot(入门Demo,整合mybatis,连接mysql)
- 怎么在自己的网站上显示其它网站_自己做网站要怎么选域名?
- MySQL表结构设计之范式化和反范式化对比
- 控制上网!!!(版本之1.1) 当前时间从网络取得。
- swagger 修改dto注解_Swagger注解及参数细节的正确书写。
- 2017第34届广州国际特许连锁加盟展览会会刊(参展商名录)
- HTML5+CSS大作业——“传统节日--端午节(9页)
- 【EXLIBRIS】#小词旮旯# 000 初衷
- 数字化转型之道:谈谈企业如何落地数据治理
- CQI原理及CQI指标优化
- 基于二值距离变换的图像细化的代码实现
- ASAN和HWASAN原理解析
- Postman中请求体提交方式
- LaTex常用技巧6:矩阵编写总结
- 数字图像 - 图像隐写