news 2026/6/14 11:21:17

UVa 437 The Tower of Babylon

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 437 The Tower of Babylon

题目描述

题目要求用给定的砖块堆砌尽可能高的塔。有nnn种砖块,每种砖块无限供应。每个砖块是长方体,尺寸为(xi,yi,zi)(x_i, y_i, z_i)(xi,yi,zi)。砖块可以任意旋转,即任意一个尺寸可以作为高度,另外两个尺寸作为底面边长。堆砌时,上方的砖块底面两个边长必须严格小于下方砖块对应的底面边长(方向可以旋转匹配)。求能堆砌的最大高度。

输入格式

输入包含多个测试用例。每个测试用例:

  • 第一行一个整数nnnn≤30n \le 30n30),表示砖块种类数。
  • 接下来nnn行,每行三个整数xi,yi,zix_i, y_i, z_ixi,yi,zi
  • 输入以n=0n = 0n=0结束。

输出格式

对于每个测试用例,输出一行:

Case case: maximum height = height

其中case为测试用例编号(从111开始),height为最大高度。

样例

输入

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 6 6 6 7 7 7 5 31 41 59 26 53 58 97 93 23 84 62 64 33 83 27 0

输出

Case 1: maximum height = 40 Case 2: maximum height = 21 Case 3: maximum height = 28 Case 4: maximum height = 342

题目分析

本题是经典的“巴比伦塔”问题,本质上是一个带约束的最长路径问题(或有向无环图上的最长路)。

状态表示

由于砖块可以旋转,每种砖块最多可以产生666种不同的放置方式(三个尺寸分别作为高度,剩下两个尺寸作为底面边长,且底面边长可交换顺序)。但注意,底面边长本身无序,因此实际上每种砖块有333种不同的高度选择(每个尺寸作为高度),每种高度对应一对底面边长。为了简化后续比较,约定每个状态的底面边长满足x≥yx \ge yxy(即底面的较长边在前)。

因此,每种砖块可以生成333个有效状态:

  • zzz为高度,底面为(x,y)(x, y)(x,y)
  • yyy为高度,底面为(x,z)(x, z)(x,z)
  • xxx为高度,底面为(y,z)(y, z)(y,z)

(这里假设x≥y≥zx \ge y \ge zxyz排序后)

问题转化

将每个状态视为一个节点,节点权值为该状态的高度。若状态uuu的底面能放在状态vvv的底面之上(即uuu的两个底面边长均严格小于vvv对应的边长),则在uuuvvv之间连一条有向边u→vu \to vuv(表示vvv可以放在uuu下面)。问题转化为求这个有向无环图(DAG\texttt{DAG}DAG)中的最长路径(节点权值和)。由于每种砖块无限供应,但状态总数有限(最多3n≤903n \le 903n90),且相同状态可重复使用(但直接使用会形成环?实际上相同状态叠放会违反边长严格递减,因此图是无环的)。

动态规划

dp[i]\textit{dp}[i]dp[i]表示以状态iii为顶部的塔的最大高度。状态转移:
dp[i]=height[i]+max⁡{dp[j]∣状态 j 可以放在状态 i 下面} \textit{dp}[i] = \textit{height}[i] + \max\{\textit{dp}[j] \mid \text{状态 } j \text{ 可以放在状态 } i \text{ 下面}\}dp[i]=height[i]+max{dp[j]状态j可以放在状态i下面}
其中“可以放在下面”意味着状态jjj的底面两个边长均严格大于状态iii的对应边长(方向可匹配,即j.x>i.xj.x > i.xj.x>i.xj.y>i.yj.y > i.yj.y>i.y,或j.x>i.yj.x > i.yj.x>i.yj.y>i.xj.y > i.xj.y>i.x)。

由于边长已按降序排列,判断条件简化为j.x>i.xj.x > i.xj.x>i.xj.y>i.yj.y > i.yj.y>i.y

按底面边长排序后,可以从前向后进行动态规划。

实现细节

  • 将每个状态存储为(x,y,h)(x, y, h)(x,y,h),其中x≥yx \ge yxy
  • 将所有状态按xxx降序(或升序)排序,以便保证转移方向。
  • 使用记忆化搜索或递推计算每个状态的最大高度。
  • 最终答案为所有dp[i]\textit{dp}[i]dp[i]的最大值。

复杂度分析

状态数S≤90S \le 90S90,转移O(S2)O(S^2)O(S2),完全可接受。

代码实现

// The Tower of Babylon// UVa ID: 437// Verdict: Accepted// Submission Date: 2016-07-20// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;structblock{intx,y,z;booloperator<(constblock&another)const{if(x!=another.x)returnx<another.x;if(y!=another.y)returny<another.y;returnz<another.z;}booloperator==(constblock&another)const{returnx==another.x&&y==another.y&&z==another.z;}};vector<block>blocks;map<int,int>memoization;intn,max_height=0;boolsmaller(intlength,intwidth,intnext_length,intnext_width){return(next_length<length&&next_width<width)||(next_length<width&&next_width<length);}voidbacktrack(intid,intlength,intwidth,intheight){for(inti=0;i<n;i++){if(smaller(length,width,blocks[i].x,blocks[i].y)){intnext_id=blocks[i].x*1000+blocks[i].y;if(memoization[next_id]>0){if(height+memoization[next_id]>max_height)max_height=height+memoization[next_id];if(height+memoization[next_id]>memoization[id])memoization[id]=height+memoization[next_id];}elsebacktrack(id,blocks[i].x,blocks[i].y,height+blocks[i].z);}}if(height>max_height)max_height=height;if(height>memoization[id])memoization[id]=height;}intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);intcases=0,x,y,z;while(cin>>n,n){blocks.clear();memoization.clear();for(inti=1;i<=n;i++){cin>>x>>y>>z;if(x<y)swap(x,y);if(x<z)swap(x,z);if(y<z)swap(y,z);blocks.push_back((block){x,y,z});blocks.push_back((block){x,z,y});blocks.push_back((block){y,z,x});}sort(blocks.begin(),blocks.end());n=unique(blocks.begin(),blocks.end())-blocks.begin();max_height=0;for(inti=0;i<n;i++)backtrack(blocks[i].x*1000+blocks[i].y,blocks[i].x,blocks[i].y,blocks[i].z);cout<<"Case "<<++cases<<": maximum height = "<<max_height<<'\n';}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 17:54:33

Open UI5 源代码解析之1435:FixedListItem.js

源代码仓库: https://github.com/SAP/openui5 源代码位置:src\sap.ui.mdc\src\sap\ui\mdc\valuehelp\content\FixedListItem.js FixedListItem.js 深度解析与项目作用说明 文件定位与总体判断 这个文件定义了一个非常轻量、却非常关键的控件类型 FixedListItem。它位于 …

作者头像 李华
网站建设 2026/6/14 11:18:50

芯海CS1238高精度ADC驱动代码包(含I2C接口、PGA配置与校准功能)

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;这个驱动包提供芯海CS1238高精度模数转换芯片的完整嵌入式支持&#xff0c;包含cs1238.c和cs1238.h两个核心文件&#xff0c;以及配套测试例程test_main.c和硬件抽象层usrgpio.h。驱动基于标准I2C协议实现&…

作者头像 李华
网站建设 2026/6/11 8:06:48

KMA320角度传感器功能安全机制深度解析与工程实践

1. 项目概述&#xff1a;为什么我们需要一个“会自检”的角度传感器&#xff1f; 在汽车的方向盘转角检测、油门踏板位置传感&#xff0c;或是工业机器人的关节角度反馈中&#xff0c;角度传感器是系统的“眼睛”。它的读数直接决定了控制系统的决策。想象一下&#xff0c;如果…

作者头像 李华
网站建设 2026/6/9 14:39:11

NXP KMA221可编程磁角度传感器配置与CRC校验实战指南

1. 项目概述在汽车电子、工业控制和机器人关节位置反馈等对可靠性要求极高的领域&#xff0c;磁角度传感器扮演着至关重要的角色。这类传感器需要将微弱的磁场变化转化为精确的电信号&#xff0c;其输出的稳定性和准确性直接决定了整个系统的性能。NXP的KMA221就是这样一款集成…

作者头像 李华
网站建设 2026/6/10 16:17:00

零依赖皇室战争风格网页游戏源码,纯HTML+JS实现,直接双击运行

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;一个不依赖任何框架或构建工具的皇室战争玩法网页小游戏&#xff0c;全部用原生HTML、CSS和JavaScript编写&#xff0c;打开index.html就能玩。游戏包含卡牌出兵机制、双路塔防对抗、实时血量计算、金币收集与消…

作者头像 李华
网站建设 2026/6/10 22:28:49

3步掌握Koikatu HF Patch:新手快速上手指南

3步掌握Koikatu HF Patch&#xff1a;新手快速上手指南 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch 还在为《恋活&#xff01;》游戏界面看不懂…

作者头像 李华