题目描述

输入格式

输出格式


题意翻译
【题目】
你可能已经听说过巴比伦塔的传说。现在这个传说的许多细节已经被遗忘。所以本着本场比赛的教育性质,我们现在会告诉你整个传说:
巴比伦人有n种长方形方块,每种有无限个,第i种方块的三边边长是xi,yi,zi。对于每一个方块,你可以任意选择一面作为底,这样高就随着确定了。举个例子,同一种方块,可能其中一个是竖着放的,一个是侧着放的,一个是横着放的。
他们想要用堆方块的方式建尽可能高的塔。问题是,只有一个方块的底的两条边严格小于另一个方块的底的两条边,这个方块才能堆在另一个上面。这意味着,一个方块甚至不能堆在一个底的尺寸与它一样的方块的上面。
你的任务是编写一个程序,计算出这个塔可以建出的最高的高度。
【输入】
输入会包含至少一组数据,每组数据的第一行是一个整数n(n<=30),表示方块的种类数。 这组数据接下来的n行,每行有三个整数,表示xi,yi,zi。 输入数据会以0结束。
【输出】
对于每组数据,输出一行,其中包含组号(从1开始)和塔最高的高度。按以下格式: Case : maximum 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

题目解析:
本题很像DAG上的动态规划,但是不一样的就是每种立方体可有无限多个,f[i]表示以第i种立方体为底时可以达到的最大高度

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define Maxn 92
using namespace std;
int V[Maxn],G[Maxn][Maxn],f[Maxn],n;
struct Cube{ int x,y; } c[Maxn];
// V 存储每个立方体的  “高 ”
inline void Add_Edge(int i,int j){if(c[i].x > c[j].x && c[i].y > c[j].y) G[i][j] = 1;if(c[i].x > c[j].y && c[i].y > c[j].x) G[i][j] = 1;
}   int dp(int i){int &ans = f[i];// C++的引用   不懂得百度一下  和下面那个DP函数的写法不一样 但是结果是一样的 if(ans > 0) return ans;ans = V[i];for(int j=1; j<=3*n; j++)if(G[i][j]) ans = max(ans,V[i] + dp(j));return ans;
}int DP(int i) {if(f[i] > 0) return f[i];f[i] = V[i]; for(int j=1; j<=3*n; j++)if(G[i][j]) f[i] = max(f[i],V[i] + DP(j));return f[i];
}int main(int argc,char* argv[]) {int kase = 0;while(scanf("%d",&n) != EOF && n) {memset(f,0,sizeof(f));memset(G,0,sizeof(G));for(int u,v,w,i=0; i<n; i++){scanf("%d %d %d",&u,&v,&w);c[i * 3 + 1].x = u,c[i * 3 + 1].y = v, V[i * 3 + 1] = w;c[i * 3 + 2].x = w,c[i * 3 + 2].y = v, V[i * 3 + 2] = u;c[i * 3 + 3].x = u,c[i * 3 + 3].y = w, V[i * 3 + 3] = v;}for(int i=1; i<=3*n; i++)for(int j=1; j<=3*n; j++)Add_Edge(i,j);for(int i=1; i<=3*n; i++) DP(i);int Ans = 0;for(int i=1; i<=3*n; i++) Ans = max(Ans,f[i]);printf("Case %d: maximum height = %d\n",++kase,Ans);} 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. 【100题】 第四十七题 序列的最长递增、递减序列

    一,题目 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2} 求一个数组的最长递增子序列 比如{1,-1,2,-3,4,-5,6,-7}的最长递 ...

  3. 第四章第十七题(一个月的天数)(Days of a month)

    第四章第十七题(一个月的天数)(Days of a month) *4.17(一个月的天数)编写一个程序,提示用户输入一个年份和一个月份名称的前三个字母(第一个字母使用大写形式),显示该月中的天数.如 ...

  4. 信息系统项目管理师必背核心考点(四十七)项目分包合同

    科科过为您带来软考信息系统项目管理师核心重点考点(四十七)项目分包合同,内含思维导图+真题 [信息系统项目管理师核心考点]项目分包合同 1.经合同约定和买方认可,卖方将其承包项目的某一部分或某几部分项 ...

  5. NeHe OpenGL教程 第四十七课:CG顶点脚本

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. java经典算法四十题

    java经典算法四十题 [程序9]题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 ".例如6=1+2+3.编程找出1000以内的所有完数. public class W ...

  7. Python编程基础:第四十七节 抽象类Abstract Classes

    第四十七节 抽象类Abstract Classes 前言 实践 前言 抽象类可以这么理解,它就是一个模板,里面声明了子类必须定义的函数,但是对于每个函数都没有给出具体实现.所有函数的实现都是在子类中定 ...

  8. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

  9. ABP源码分析四十七:ABP中的异常处理

    ABP源码分析四十七:ABP中的异常处理 参考文章: (1)ABP源码分析四十七:ABP中的异常处理 (2)https://www.cnblogs.com/1zhk/p/5538983.html (3 ...

  10. 【零基础学Java】—finally代码块(四十七)

    [零基础学Java]-finally代码块(四十七)

最新文章

  1. Solr在Weblogic中部署遇到的问题
  2. C# 创建、部署、调用WebService
  3. 《京东技术解密》读书笔记:坚持技术十年如一日
  4. 攻防世界Reverse第十一题csaw2013reversing2
  5. IntelliJ IDEA添加过滤文件或目录(转)
  6. 分享一些优化博客的心得
  7. 计算机基础知识学前自测,2011计算机二级C语言学前自测题:DOS的基本操作
  8. EasyUI 扩展自定义EasyUI校验规则 验证规则
  9. Miller Rabin算法:大质数判断
  10. 计算机工程主编陶小雪,城市环境所在MOFs基催化剂的制备和VOCs催化氧化方面取得进展...
  11. 《与孩子一起学编程》译者序
  12. http_load压力测试步骤
  13. Redis详细下载安装教程
  14. Hybrid App 开发快速指南
  15. RaspberryPi树莓派连接Wifi
  16. 交换机ARP代理详解
  17. backurl: heytapbrowser://main/iflow?sub_target=only_enter_iflow
  18. 信号与系统(Python) 学习笔记 (6) 拉普拉斯变换 Laplace Transform
  19. SpringCloud分布式开发五大神兽(转)
  20. java 枚举报错_java 枚举

热门文章

  1. 金属芯PCB中的贵族,热电分离铜基板(高导热380W)
  2. Eclipse WindowBuilder安装过程
  3. python分支结构、循环结构
  4. USB 3.0 对无线鼠标的干扰问题
  5. KALI搭建个人wifi热点
  6. python画四叶草代码-python学习
  7. stata基本操作(一)
  8. Unity获取物体下的子物体+只获取子物体
  9. 一个脚本教你快速去除桌面图标烦人的小箭头
  10. 漫话:如何给女朋友解释什么是CDN?