巴比伦人有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最长路

一个长方体需要建三个点表示三种情况,记搜一下就可以了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e6+5;
 4 const int INF=1e9+7;
 5 int x[205],y[205],z[205];
 6 int n,cas,ans,dp[205];
 7 bool g[155][155];
 8 template <class t>void red(t &x)
 9 {
10     x=0;
11     int w=1;
12     char ch=getchar();
13     while(ch<'0'||ch>'9')
14     {
15         if(ch=='-')
16             w=-1;
17         ch=getchar();
18     }
19     while(ch>='0'&&ch<='9')
20     {
21         x=(x<<3)+(x<<1)+ch-'0';
22         ch=getchar();
23     }
24     x*=w;
25 }
26 void input()
27 {
28     freopen("input.txt","r",stdin);
29 }
30 bool check(int a,int b)
31 {
32     if((x[a]<x[b]&&y[a]<y[b])||(x[a]<y[b]&&y[a]<x[b]))
33         return 1;
34     return 0;
35 }
36 int solve(int u)
37 {
38     if(dp[u])
39         return dp[u];
40     dp[u]=z[u];
41     for(int i=0;i<n;++i)
42         if(g[u][i])
43             dp[u]=max(dp[u],solve(i)+z[u]);
44     return dp[u];
45 }
46 int main()
47 {
48     input();
49     while(scanf("%d",&n)==1&&n)
50     {
51         ++cas;
52         ans=0;
53         //memset(g,0,sizeof(g));
54         memset(dp,0,sizeof(dp));
55         printf("Case %d: maximum height = ",cas);
56         for(int i=0;i<n;++i)
57         {
58             red(x[i]);
59             red(y[i]);
60             red(z[i]);
61             x[i+n]=y[i];
62             y[i+n]=z[i];
63             z[i+n]=x[i];
64             x[i+n+n]=z[i];
65             y[i+n+n]=x[i];
66             z[i+n+n]=y[i];
67         }
68         n*=3;
69         for(int i=0;i<n;++i)
70             for(int j=i+1;j<n;++j)
71             {
72                 g[i][j]=check(i,j);
73                 g[j][i]=check(j,i);
74             }
75         for(int i=0;i<n;++i)
76             ans=max(ans,solve(i));
77         printf("%d\n",ans);
78     }
79     return 0;
80 }

View Code

转载于:https://www.cnblogs.com/Achensy/p/10777653.html

uva437巴比伦塔相关推荐

  1. UVA437 巴比伦塔 The Tower of Babylon(矩形嵌套进阶版、DAG上DP、记忆化搜索)

    整理的算法模板合集: ACM模板 本题和基础的矩形覆盖差不多,只不过变成了三维的长方形. 因为每次转移的时候只有顶面的x和y会影响决策的进行,所以我们只需要用一个二元组(a,b)(a, b)(a,b) ...

  2. 第7章 为什么巴比伦塔会失败

    第7章 为什么巴比伦塔会失败 标签:人月神话 现在整个大地都采用一种语言,只包括为数不多的单词.在一次从东方往西方迁徙的过程中,人们发现了苏美尔地区的一处平原,并在那里定居下来.接着他们奔走相告说:& ...

  3. 人月神话(三)画蛇添足、贯彻执行、为什么巴比伦塔会失败?

    第5章 画蛇添足 如果将制定功能规格说明的责任从开发快速.成本低廉的产品的责任中分离出来,那么有什么样的准则和机制来约束结构师的创造性激情呢? Part 1 结构师的交互准则和机制 面对估算过高的难题 ...

  4. [UVa-437] Color Length

    计算贡献:压缩空间优化时间 传送门:$>here<$ 题意 给出两个字符串$a$,$b$,将他们穿插起来(相对位置不变),要求最小化$\sum L(c)$,其中$L(c)$的定义时在穿插完 ...

  5. 【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 ...

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

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

  7. ASCII、Unicode、GBK和UTF-8字符编码的区别联系

    一直对编码这块晕晕乎乎,今天终于看到一篇写的很清楚也很风趣的文章,转过来mark一下. 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状 ...

  8. Unicode 和 UTF-8关系

    unicode 就是 "与存储无关的表示",utf-8 就是 "二进制表示".一句话,utf8是对unicode字符集进行编码的一种编码方式,utf8是给uni ...

  9. unicode,ansi,utf-8,unicode big endian编码的区别

    为什么80%的码农都做不了架构师?>>>    随便说说字符集和编码 快下班时,爱问问题的小朋友Nico又问了一个问题: "sqlserver里面有char和nchar,那 ...

最新文章

  1. 运维监控系统——配置服务监控项(Http,Nginx,MySQL)
  2. 《ANTLR 4权威指南》——2.1节从ANTLR元语言开始
  3. jetson nano 人脸识别
  4. sqlserver数据库创建表
  5. 牛客练习赛26 D xor序列 (线性基)
  6. string函数知识点总结
  7. matlab哈明窗带阻,基于matlabFIR低通,高通,带通,带阻滤波器设计.doc
  8. 我也给要来澳大利亚的虫子们一点建议
  9. lua upvalue
  10. 计算机服务中无spool,打印服务SPOOLSV.EXE自动停止
  11. JMeter下载及使用
  12. Linux权限的理解 | 粘滞位 |权限掩码 |文件类型
  13. 开发者新手指南:一文汇总 Web3 开发工具
  14. 复利计算器app发布
  15. Android 报错Android - Performing stop of activity that is not resumed
  16. 【4G5G基础学习】物理层-物理随机接入信道PRACH与随机接入过程
  17. 找不到msvcr110.dll
  18. win10在此计算机上找不到系统映像,图文教你win10系统使用DISM修复找不到源的问题....
  19. Altera特殊管脚的使用(适用全系列Altera FPGA,MSEL区别除外)-来自altera论坛
  20. Android 原生分享文件到微信

热门文章

  1. delphi调用选择目录对话框
  2. 23种设计模式C++源码与UML实现--适配器模式
  3. volatile类型的数据
  4. 25匹马,找出最快的3匹,但是只有5个赛道,每次比赛只能得到5匹马的速度排序,那么最少需要多少次比赛
  5. 【❌❌N种姿势满足你遍历C++ vector⭕⭕】C++ vector 遍历
  6. PyTorch基础(十)----- torch.max()方法
  7. 操作系统(二十七)管程
  8. linux不能ping通域名能ping通ip
  9. 从Tensorflow代码中理解LSTM网络
  10. android的窗口机制分析------UI管理系统