UVA437 巴比伦塔

UVA437 巴比伦塔 The Tower of Babylon(矩形嵌套进阶版、DAG上DP、记忆化搜索) 本题和基础的矩形覆盖差不多,只不过变成了三维的长方形。 因为每次转移的时候只有顶面的x和y会影响决策的进行,所以我们只需要用一个二元组(a,b)(a, b)(a,b)来表示顶面即可。 但是因为长方体的长宽高可能会很大,所以如果我们直接用一个数组表示数值的话是存不下的,因此我们令开一个数组存下所有点的信息,用x表示每一个点的标号即可。至于如何表示高是谁(高实际上就是我们放置这个长方体时获得的权值)因为一共有三个边的长度,我们可以将他们标号为0,1,2,放到一个数组里,我们用k表示这个高的标号,我们每次找答案. 阅读详情

题目链接:https://www.luogu.com.cn/problem/UVA437

题目:有n(n≤30)种立方体,每种都有无穷多个。要求选一些立方体摞成一根尽量高的柱子(可以自行选择哪一条边作为高),使得每个立方体的底面长宽分别严格小于它下方立方体的底面长宽。
intput:

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

output:

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

思路:题目表明每增加一个立方体,长宽都会严格减少,这时我们可以用DAG最长路模板套上去,每个立方体都可以分为三个,例如输入a,b,c,分为以a,b,c作高(有人说是6个,但其实是一样的,因为6个里面必定有两个高是一样,并且长*宽的面积相同),在程序中可以直接判断。

所以我们可以设置一个数组,用dp[i]来表示以第i个方块为底,所能达到的最大高度

样例解析:

解释一下第一个样例,可以拓展为{10,20,30},{10,30,20},{30,20,10}3个立方体,第一个立方体作为底时dp[1]=30(很明显啊,因为其他两块不符合条件),以第二个立方体为底时,dp[1]=20,同理。

以第三个立方体为底时,我们发现第一个立方体可以放上去,这个时候我们已经计算出以第一个立方体为底时的最大高度是多少了,这就是动态规划的精髓,避免了重复计算,所以直接返回dp[2]+h3(第三个立方体的高)

 

ps:另外有一个需要注意的地方,题目中说需要长宽分别严格大于上面立方体的长宽,在这个地方卡了很久,因为我直接计算了两个的面积,然后比较,当然是错误的

最后复习一下结构体重载运算符的知识

例如这样一个定义

bool operator > (const node& now) const{}

这两个const有啥用?

在函数后面加上一个const,编译器就不允许operator>修改类的数据成员

const对象执行时不能调用非const函数

里面的表示数据成员不能被修改,外面的表示函数不能修改数据成员

#include<iostream>
#include<cstring>
#include<math.h>
#include<stdlib.h>
#include<cstring>
#include<cstdio>
#include<utility>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll; 
inline int read(){
    int X=0,w=0;char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
/*------------------------------------------------------------------------*/
const int maxn=105; 

struct node{
	int x,y,z;
	void init(int a,int b,int c){
		x=a,y=b,c=z;
	}
	bool operator > (const node& now){
		return ((x>now.x&&y>now.y)||(x>now.y&&y>now.x));
		//return x*y>now.x*now.y;
	}
}star[maxn];
int maze[maxn][maxn];
int dp[maxn];
int n;

int Dp(int now){
	
	if(dp[now])return dp[now];
	dp[now]=star[now].z;//取当前节点的高 
	
	for(int j=1;j<=3*n;++j){
			
		if(star[now]>star[j])
		dp[now]=max(dp[now],star[now].z+Dp(j));
		
	}
	
	return dp[now];
}

int main( )
{	
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    //freopen("a.txt","r",stdin);
    //freopen("a.txt","w",stdout);
    int cnt=1;
    while(cin>>n&&n){
    	memset(dp,0,sizeof(dp));
    	memset(maze,0,sizeof(maze));
    	for(int i=1;i<=3*n;i+=3){
    		
    		int a,b,c;
    		cin>>a>>b>>c;
    		
    		star[i].x=a;
    		star[i].y=b;
    		star[i].z=c;
    		
    		star[i+1].x=a;
    		star[i+1].y=c;
    		star[i+1].z=b;
    		
    		star[i+2].x=c;
    		star[i+2].y=b;
    		star[i+2].z=a;
    	}
    	
    	
    	int res=0;
    	
    	for(int i=1;i<=3*n;++i){
    		
    		
    		res=max(res,Dp(i));
    		
    	}
    	
    	cout<<"Case "<<cnt++<<": "<<"maximum height = "<<res<<endl;
    }
    
    
    return 0;
}

 

[动态规划] UVa437 巴比伦塔 (DAG的不确定起点终点的最长路) 题目 有n(n≤30)种立方体,每种都有无穷多个。要求选一些立方体摞成一根尽量高的柱子 (可以自行选择哪一条边作为高),使得每个立方体的底面长宽分别严格小于它下方立方体的底面长宽。 思路 DAG的不确定起点终点的最长路 1.状态及指标函数:d(i),在编号为i的立方体做塔的最底部,所能叠出的最高高度。(包括此立方体) 2.状态转移方程: d(i)=maxd(j)+i.h|(j,i)∈E... 阅读详情

相关推荐

UVA 437 例题9-2 巴比伦塔 (DAG上的动态规划)

题意;有n种立方体,每种都有无穷多个,要求选一些立方体落成一根尽量高的柱子(可以任选那边作为长宽高),使得每一个立方体的底面长宽严格小于它下方的立方体底面的宽和长。 分析:书上讲解的很详细,书上的方法是可以用二元组(a,b)来表示“顶面尺寸长和宽",因为每次增加一个立方体后长和宽都会严格减小,这就构成了DAG最长路算法。不过在写程序的时候,由于a,b,很大,所以不能直接用d(a,b)表示状态值,

01的世界 893

UVa 437 The Tower of Babylon

Uva 437

fuzekun的博客 379

Dbeaver连接TDengine时序数据库

也没啥好总结的,就一句话:Dbeaver真香,而且还是我大JAVA实现的,赞。希望能帮到大家,uping。

zwrlj527的专栏 1903

UVA 437 巴比伦塔(DAG上的动态规划)

红书上的动态规划专题 题意:有n种立方体,每种都有无穷多个,要求选一些立方体摞成一根尽量高的柱子,可以自行选一边当多高,使得每个立方体的底面长宽分别严格小于它下方的立方体的底面长宽 思路:各个立方体 “能否被摞”关系是一个典型的二元关系,二元关系可以用图来建模,如果b能摞在a上,a到b就有一条有边向,所以这就是一个DAG,所要求的便是DAG上的最长路径,因为任意一条边都可以当作高,所以

GYH0730的博客 589

一文搞懂 Transformer 工作原理 !!

本文将从单头Attention工作原理多头Attention工作原理全连接网络工作原理三个方面,实现一文搞懂Transformer的工作原理。Transformer工作原理。

不要给自己设限,尝试更多可能(思所向 皆可往) 2990

智能座舱芯片大乱斗:高通8155 vs 联发科MT8676 vs 华为麒麟990A,谁才是性价比之王?

本文深入对比了高通SA8155P、联发科MT8676与华为麒麟990A三款主流智能座舱芯片的性能、生态与成本。文章从CPU/GPU/NPU算力、开发生态、成本模型及典型应用场景出发,分析了各自在智能座舱领域的优势与适用性,为开发者与车企选型提供了实战参考,并探讨了智能座舱芯片未来的技术趋势。

yhn456789的博客 806

UVA-437(带递归的dp)

The Tower of Babylon UVA - 437 问题描述: 输入输出说明: 思路: 带递归的dp ac code: #include<bits/stdc++.h> using namespace std; struct Node{ int v[4]; }a[40]; int n; int k=0; int d[100][100]; int dp(int i,int k){ int& ans=d[i][k]; if(ans!=-1)return ans; an

雪岩的博客 397

UVA—437 (DAG最长路算法)The Tower of Babylon

原题链接: UVA-437 测试样例 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 6 6 7 7 7 5 31 41 59 26 53 58 97 93 23 84 62 64 33 83 27 0 Sample Output Case 1: maximum height = 40 Case 2: maximum height = 21 Case 3: maximum height = 28 Case

pursuit的博客 540

保姆级教程:用Python spatialdata框架搞定10x Xenium空间转录组数据(从下机到高级分析)

本教程详细介绍了如何使用Python spatialdata框架处理10x Xenium空间转录组数据,从数据获取到高级分析的全流程。涵盖环境配置、数据读取、质量控制、降维聚类、细胞注释及空间共定位分析等关键步骤,特别适合生物信息学研究者快速掌握Xenium数据分析技术。

weixin_30300225的博客 484

深度学习12—VGG19实现

state_dict = load_state_dict_from_url(model_urls['vgg19'],model_dir='./model' ,progress=progress)#预训练模型地址。accuracy=((out.argmax(1)==label).sum()).clone().detach().cpu().numpy()#正确预测的总和比测试集的长度,即预测正确的精度。image=torch.reshape(image,(1,3,224,224))#四维图形,RGB三个通。

m0_55196097的博客 2444

例题9-2 巴比伦塔 UVa437

1.题目描述:点击打开链接 2.解题思路:本题利用动态规划解决,由于影响决策的因素是顶面的尺寸,因此可以用二元组(a,b)表示“顶面尺寸为a,b这个状态”,由于每次都要求增加一个立方体后顶面的长和宽都会严格减小,因此这个图是一个DAG,可以利用DAG上的最长路算法解决。不过这里会遇到一个问题,由于a,b可能很大,不能直接用d(a,b)表示状态。此时可以利用间接表示法:用(idx,k)表示(a,b

Skyline 1603

【系统分析师】2025年下半年真题:综合知识-答案及详解(回忆版)

本文摘要包含系统分析师考试相关题目解析,主要涵盖软件工程、数据库、网络协议和项目管理等知识点。内容包括:软件再工程与逆向工程的区别(D);GNU GPL开源协议特性(A);TCP/IP协议分层(A、B);数据库范式判定(A、B);前导图进度管理工具(C);系统规划中的数据类识别方法(B、D);关系代数除运算(C);CMM优化级特征(A);回归测试重要性(C)。这些解析帮助理解核心概念和考试重点。

数据知道的博客 6720

UVa 437 巴比伦塔(The Tower of Babylon)详细题解

题目传送门:https://vjudge.net/problem/UVA-437题目:Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line with the educational na

Monica 1394

【Metashape精品教程4】软件设置

介绍Metashape软件设置

penglu366366的博客 2950

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

UVA 437 巴比伦塔 DAG模型+记忆化

UVA 437 巴比伦塔 题目大意: 有n(n<=30) 种立方体,每种都有无穷多个。要求选一些立方体摞成一根尽量高的柱子(任意一条边都可以作为高),使得每个立方体的底面长宽分别严格小于它下方立方体的底面长宽。 DAG模型————无固定终点的最长路 详情请见算法竞赛入门经典(第二版) Page269 原创代码,三种情况分得很清楚。 #include<cstdio> #include<iostream> #include<cstring> using namespac

hahahaki的博客 294

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

UVA 437 巴比伦塔

#include #include #include #include using namespace std; struct node{ int a[4]; node(){} void Sort(){sort(a, a+3);} }p[1200]; bool g[120][4][120][4]; bool vis[120][4]; int n, dp[120][4]; bool

230

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

27.巴比伦塔(UVa 437)

有n(n≤30)n(n≤30)n(n≤30)种立方体,每种都有无穷多个。要求选一些立方体摞成一根尽量高的柱子(可以自行选择哪一条边作为高),使得每个立方体的底面长宽分别严格小于它下方立方体的底面长宽。 #include <iostream> #include <stdio.h> #include <cstring> #include <algorithm&...

W_LAILAI的博客 479

紫书 UVa437巴比伦塔

题目链接:UVa437巴比伦塔题解:这个就是矩形嵌套的改变,把2D变为3D了,然后加1变为加上他们的高度注意点是一个矩形可以有三种不同的形态#include &lt;cstdio&gt; #include &lt;algorithm&gt; #include &lt;cstring&gt; using namespace std; int n; int p; //保存各个矩形的数量,一个矩形有三...

sen的博客 361

DAG的DP(UVA437 巴比伦塔 The Tower of Babylon)

DAG 是一种没有环路的有向图,具有拓扑序特性。动态规划在 DAG 上的应用通常基于拓扑序或记忆化搜索。(像我这种暂时还没学过拓扑排序的可以用dfs+记忆化搜索)

2401_88124440的博客 1024

UVA437 巴比伦塔 The Tower of Babylon

你可能已经听说过巴比伦塔的传说。现在这个传说的许多细节已经被遗忘。所以本着本场比赛的教育性质,我们现在会告诉你整个传说:巴比伦人有n种长方形方块,每种有无限个,第i种方块的三边边长是xiyizi。对于每一个方块,你可以任意选择一面作为底,这样高就随着确定了。举个例子,同一种方块,可能其中一个是竖着放的,一个是侧着放的,一个是横着放的。他们想要用堆方块的方式建尽可能高的塔。问题是,只有一个方块的底的两条边严格小于另一个方块的底的两条边,这个方块才能堆在另一个上面。

Gowi的博客 1175

【算法竞赛入门经典例题题解】 【DP】练习城市里的间谍 A Spy in the Metro UVA1025 UVA437 巴比伦塔 刘汝佳

【算法竞赛入门经典例题题解】 【DP】 UVA1025 练习城市里的间谍 A Spy in the Metro 洛谷链接 UVA1025 练习城市里的间谍 A Spy in the Metro 题目 某城市地铁是一条直线,有 nn(2\leq n\leq 502≤n≤50)个车站,从左到右编号 …n。有 M1辆列车从第 1 站开始往右开,还有 M2 辆列车从第 n 站开始往左开。列车在相邻站台间所需的运行时间是固定的,因为所有列车的运行速度是相同的。在时刻 0,Mario 从第 1 站出发,目的在时刻 T(

csxylrf的博客 304

uva437巴比伦塔

巴比伦人有n种长方形方块,每种有无限个,第i种方块的三边边长是xi,yi,zi。对于每一个方块,你可以任意选择一面作为底,这样高就随着确定了。举个例子,同一种方块,可能其中一个是竖着放的,一个是侧着放的,一个是横着放的。 他们想要用堆方块的方式建尽可能高的塔。问题是,只有一个方块的底的两条边严格小于另一个方块的底的两条边,这个方块才能堆在另一个上面。这意味着,一个方块甚至不能堆在一个底的尺寸...

weixin_30510153的博客 109

UVA437巴比伦塔

题目 原题链接 巴比伦人有n种长方形方块,每种有无限个,第i种方块的三边边长是xi,yi,zi。对于每一个方块,你可以任意选择一面作为底,这样高就随着确定了。举个例子,同一种方块,可能其中一个是竖着放的,一个是侧着放的,一个是横着放的。 他们想要用堆方块的方式建尽可能高的塔。问题是,只有一个方块的底的两条边严格小于另一个方块的底的两条边,这个方块才能堆在另一个上面。这意味着,一个方块甚至不能堆在一个底的尺寸与它一样的方块的上面。 解题思路 对于每种长方体,总共有三种摆放方式 尺寸相同且摆放方式相同的长方体

陈颜的博客 483

uva 437,巴比伦塔

题目链接:https://uva.onlinejudge.org/external/4/437.pdf 题意:巴比伦塔: 给出n种立方体,一个立方体能放到另一个立方体上,必须满足,底面一定要小于下面的立方体。求巴比伦塔最多堆多高? 分析: DAG很容易想到,主要是状态的描叙。 一个立方体,他有3种情况,状态的描叙就用dp[id][3],此时dp[][i] I 来记录哪个是高。 ...

weixin_30922589的博客 85
上一篇: 树状数组模板
下一篇: 字典树&&AC自动机---看完应该会...了...吧
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值