原题链接:https://vjudge.net/problem/UVA-437
分类:DAG
备注:记忆化搜索
#include<bits/stdc++.h>
using namespace std;
const int maxn=35;
struct Cube{
int len,wid,hig;
}c[maxn*3];
int res[maxn*3],n,tot,kase;
int dp(int ind){
if(res[ind])return res[ind];
res[ind]=c[ind].hig;
for(int i=1;i<=tot;i++){
if((c[ind].len>c[i].len&&c[ind].wid>c[i].wid)||(c[ind].len>c[i].wid&&c[ind].wid>c[i].len))
res[ind]=max(res[ind],dp(i)+c[ind].hig);
}
return res[ind];
}
int main(void){
// freopen("in.txt","r",stdin);
while(~scanf("%d",&n)&&n){
memset(res,0,sizeof(res));
tot=0;
for(int i=1;i<=n;i++){
int a,b,h;
scanf("%d%d%d",&a,&b,&h);
tot++;
c[tot].len=a; c[tot].wid=b; c[tot].hig=h;
tot++;
c[tot].len=a; c[tot].wid=h; c[tot].hig=b;
tot++;
c[tot].len=h; c[tot].wid=b; c[tot].hig=a;
}
for(int i=1;i<=tot;i++)
if(!res[i])dp(i);
int ans=0;
for(int i=1;i<=tot;i++)
ans=max(ans,res[i]);
printf("Case %d: maximum height = %d\n",++kase,ans);
}
return 0;
}