题目大意: 给出n个长方形的长宽高,长宽高是可以互相转换的,由两个组成长方形的底部,另外一个是高度,把可能得到的长方体叠加在一起,求最高的高度,叠加的条件是上边的长方体的底部边长小于下面的长方体的底部的边长;
思路分析:把可能得到的长方体都存下来,把任意两个长方体能叠加在一起的连一条边,也就是建图的过程,然后对与每一个长方体进行搜索,找出一条最长的路径。
代码实现:
#include<cstdio>
#include<cstring>
#include<iostream>
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define MEM(a) (memset((a),0,sizeof(a)))
#define MEME(a) (memset((a),-1,sizeof(a)))
#define MEMX(a) (memset((a),0x3f,sizeof(a)))
using namespace std;
const int N=100;
int G[N][N],d[N],cnt;
struct node{
int x,y,z;
}rec[N];
int dfs(int i){
int& ans=d[i];
if(ans>0) return ans;
ans=rec[i].z;
for(int j=0;j<cnt;++j){
if(G[i][j]) ans=Max(dfs(j)+rec[i].z,ans);
}
return ans;
}
int main(){
int n,xx,yy,zz;
int Case=0;
while(~scanf("%d",&n),n){
MEM(G),MEM(d);
cnt=0;
int max_h=-1;
while(n--){
scanf("%d%d%d",&xx,&yy,&zz);
rec[cnt].x=xx,rec[cnt].y=yy,rec[cnt++].z=zz;
rec[cnt].x=xx,rec[cnt].y=zz,rec[cnt++].z=yy;
rec[cnt].x=yy,rec[cnt].y=zz,rec[cnt++].z=xx;
}
for(int i=0;i<cnt;++i){
for(int j=0;j<cnt;++j){
if((rec[i].x<rec[j].x&&rec[i].y<rec[j].y)||(rec[i].x<rec[j].y&&rec[i].y<rec[j].x))
G[i][j]=1;
}
}
for(int i=0;i<cnt;++i)
max_h=Max(dfs(i),max_h);
printf("Case %d: maximum height = %d\n",++Case,max_h);
}
}