题意:给n种箱子的长宽高,每种箱子个数不限。若一个箱子的长宽都严格大于另一个,可以将小箱子其垒到大箱子上。求可以垒到的最大高度。
由于箱子个数不限,将给出的长宽高分别作为高,可得到3*n种箱子。用状态转移方程 d[i]=max(d[j])+height[i],(j<i且第j个箱子的长宽都大于第i个箱子);
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 0x7fffffff
#define N 110
using namespace std;
struct node
{
int x,y,z;
}p[N];
int cnt,d[N];
void build_point(int x,int y,int z)
{
if(x>y) swap(x,y);
p[cnt].x=x;
p[cnt].y=y;
p[cnt++].z=z;
}
bool cmp(node a,node b)
{
return a.x>b.x;
}
int main()
{
int n;
int kase=0;
while(scanf("%d",&n)&&n)
{
cnt=0;
for(int i=0;i<n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
build_point(x,y,z);
build_point(y,z,x);
build_point(z,x,y);
}
sort(p,p+3*n,cmp);
d[0]=0;
int ans=0;
for(int i=0;i<cnt;i++)
{
int mmax=0;
for(int j=0;j<i;j++)
if(p[j].y>p[i].y&&p[j].x>p[i].x) mmax=max(mmax,d[j]);
d[i]=mmax+p[i].z;
ans=max(ans,d[i]);
}
printf("Case %d: maximum height = %d\n",++kase,ans);
}
}