社区讨论
萌新求助巴比伦塔
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 条回复,欢迎继续交流。
正在加载回复...