社区讨论

萌新求助巴比伦塔

UVA437巴比伦塔 The Tower of Babylon参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo84ib5f
此快照首次捕获于
2023/10/27 12:38
2 年前
此快照最后确认于
2023/10/27 12:38
2 年前
查看原帖
RT。样例就挂了帮帮孩子吧,今晚真的想早睡。。。
CPP
#include<bits/stdc++.h> 
using namespace std;
//以一个立方体的一面为底,最优的摆放方式是一定的,使用 记搜
//f[i][j]表示以第i个立方体的第j面(j≤3)为底,往上堆的最大高度
//枚举所有正方体的每一个面,选择符合条件(长宽更小)的进行转移。
int n,ans;
struct E
{
	int x,y,z;
}e[50];
int k;
int f[50][5],vis[50][5];
inline bool cmp(E x,E y) {
    return (x.x<y.x&&x.y<y.y)||(x.y<y.x&&x.x<y.y);
}
int dp(int id,int h)
{
	if(vis[id][h]) return f[id][h];
	vis[id][h] = 1;
	int E[2],hnow;
	if(h == 1)
		E[0] = e[id].y,E[1] = e[id].z,hnow = e[id].x;
	if(h == 2)
		E[0] = e[id].x,E[1] = e[id].z,hnow = e[id].y;
	if(h == 3)
		E[0] = e[id].x,E[1] = e[id].y,hnow = e[id].z;
	//判断当前哪两个数据做底面, 哪1个做高
	for(int i=1; i<=n; i++)
	{
		if(e[i].x < E[0] && e[i].y < E[1]) f[id][h] = max(f[id][h],dp(i,3)+hnow);
		if(e[i].x < E[0] && e[i].z < E[1]) f[id][h] = max(f[id][h],dp(i,2)+hnow);
		if(e[i].y < E[0] && e[i].z < E[1]) f[id][h] = max(f[id][h],dp(i,1)+hnow);
	}
	return f[id][h];
}
int main()
{
	while(cin>>n && n!=0)
	{
		ans = -1;
		memset(vis,0,sizeof(vis));
		memset(f,0,sizeof(f));
		for(int i=1; i<=n; i++) cin>>e[i].x>>e[i].y>>e[i].z;
		sort(e+1,e+n+1,cmp);
		for(int i=1; i<=n; i++)
		{
			for(int j=1; j<=3; j++)
			{
				ans = max(ans,dp(i,j));
			} 
		}
		printf("Case %d: maximum height = %d\n", ++k, ans);
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...