UVA437 巴比伦塔 The Tower of Babylon(矩形嵌套进阶版、DAG上DP、记忆化搜索)
整理的算法模板合集: ACM模板
本题和基础的矩形覆盖差不多,只不过变成了三维的长方形。
因为每次转移的时候只有顶面的x和y会影响决策的进行,所以我们只需要用一个二元组(a,b)(a, b)(a,b)来表示顶面即可。
但是因为长方体的长宽高可能会很大,所以如果我们直接用一个数组表示数值的话是存不下的,因此我们令开一个数组存下所有点的信息,用x表示每一个点的标号即可。至于如何表示高是谁(高实际上就是我们放置这个长方体时获得的权值)因为一共有三个边的长度,我们可以将他们标号为0,1,2,放到一个数组里,我们用k表示这个高的标号,我们每次找答案的时候直接枚举拿一条边是高,然后长和宽我们就可以直接等于(k + 1) % 3
以及 (k + 2) % 3
。这样就可以简单明了地表示各各需要的状态了。
我们直接记忆化搜索解决即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;const int N = 207, M = 5e3 +7, maxn = 1007;
const int mod = 1e9+7;
const int INF = 0x3f3f3f3f;int n, m;
struct node{int po[3];
}pos[N];int idx;
int kcase;
int f[N][3];
//x表示的是长方体的编号,k表示的是哪一条边是高
int dp(int x, int k)
{if(f[x][k] > 0)return f[x][k];int& ans = f[x][k];ans = pos[x].po[k];//初始化为该长方体的高for(int i = 1; i <= n; ++ i)for(int j = 0; j <= 2; ++ j){int ua = (k + 1) % 3;//上面的长和宽的编号int ub = (k + 2) % 3;//if(ua > ub)这个不能用于比较// swap(ua, ub);int da = (j + 1) % 3;//下面的长和宽int db = (j + 2) % 3;if((pos[x].po[ua] < pos[i].po[da] && pos[x].po[ub] < pos[i].po[db]) || (pos[x].po[ub] < pos[i].po[da] && pos[x].po[ua] < pos[i].po[db])){ans = max(ans, dp(i, j) + pos[x].po[k]);}}return ans;
}int main()
{while(scanf("%d", &n) != EOF && n){memset(pos, 0, sizeof pos);memset(f, 0, sizeof f);for(int i = 1; i <= n; ++ i)scanf("%d%d%d", &pos[i].po[0], &pos[i].po[1], &pos[i].po[2]);int ans = -INF;for(int i = 1; i <= n; ++ i)for(int k = 0; k <= 2; ++ k)ans = max(ans, dp(i, k));printf("Case %d: maximum height = %d\n", ++ kcase, ans);}return 0;
}
UVA437 巴比伦塔 The Tower of Babylon(矩形嵌套进阶版、DAG上DP、记忆化搜索)相关推荐
- 【UVA 437】The Tower of Babylon(记忆化搜索写法)
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 嵌套矩形——DAG上的动态规划
有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 题目描述: 有n个矩形,每个矩形可以用 ...
- 南阳OJ 16 矩形嵌套
描写叙述 有n个矩形,每个矩形能够用a,b来描写叙述,表示长和宽. 矩形X(a,b)能够嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度). ...
- NYOJ 16(矩形嵌套)
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...
- nyoj 16 矩形嵌套 (DAG上的DP)
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...
- NYOJ 16 矩形嵌套
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...
- NYOJ 16 矩形嵌套(动态规划)
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...
- Codeup-问题 A: 问题 A: 矩形嵌套
题目描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如( ...
- 【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 ...
最新文章
- docker挂载目录原理
- 使用BootStrap制作用户登录UI
- IE开发人员工具之实用功能讲解
- UESTC学位论文latex模板下载
- linux 下串口转usb不能发送数据包,红帽redhat下 串口转USB问题 linux
- numa节点_NUMA架构下的内存访问延迟区别!
- discuz mysql data_discuz调取数据库数据
- bandicam安装注册
- 解决google浏览器自动填充密码问题
- 使用screw一键生成数据库文档
- [译] MySQL 最佳实践 —— 高效插入数据
- 基于k-近邻算法的室内WiFi位置指纹定位实验报告
- java汉诺塔(含汉诺塔问题的详解)
- java 内联_Java内联类初探
- SAP中采购订单历史分类标识与实际业务描述
- 服务器合租与虚拟主机的区别
- Segment Anything论文详解(SAM)
- Google Android:羊养肥了再杀?
- 未雨绸缪-变化是永恒的
- crm系统服务器端,安装 Microsoft Dynamics CRM 前端服务器和后端服务器角色