当前位置: 代码迷 >> 综合 >> UVA 437 The Tower of Babylon
  详细解决方案

UVA 437 The Tower of Babylon

热度:59   发布时间:2023-09-23 09:14:09.0
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
//状态定义:d[idx][h] 
//现在是序列为idx的长方体,高h在idx中第几个 最多还能有多高(包括当前这个立方体) 
int blocks[35][3],d[35][3],N;
int dp(int idx,int h)
{int& ans=d[idx][h];if(ans) return ans;ans=0;    int p=0,v[2];  //v为现在长宽; for(int i=0;i<3;i++) if(i!=h) v[p++]=blocks[idx][i];for(int i=0;i<N;i++){int v2[3]; //v2为准备放上去的 memcpy(v2,blocks[i],sizeof(v2));do{if(v2[0]<v[0]&&v2[1]<v[1]) {int h1=find(blocks[i],blocks[i]+3,v2[2])-blocks[i];ans=max(ans,dp(i,h1));}}while(next_permutation(v2,v2+3));}ans+=blocks[idx][h];  //加上当前这一层的高度 return ans;
}
int main()
{int kase=0;while(scanf("%d",&N)&&N){for(int i=0;i<N;i++){for(int j=0;j<3;j++) cin>>blocks[i][j];sort(blocks[i],blocks[i]+3);}int ans=0;memset(d,0,sizeof(d));for(int i=0;i<N;i++) for(int h=0;h<3;h++)ans=max(ans,dp(i,h));printf("Case %d: maximum height = %d\n",++kase,ans);}return 0;
}