题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1069题意:
给出一些长方体箱子,长宽都小于另一个箱子的可以摞在一起,求能够摞起来的最大高度。
思路:
简单dp,主要是数据很小最多30个箱子,于是直接n^2暴力dp即可,注意是长方体箱子,任意一面都可以做底,所以每个箱子分成三种箱子,然后暴力dp每个箱子上面能摞的最大箱子高度。代码:
#define N 112345
int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2;
struct node
{
int x,y,z;
friend bool operator < (node a, node b)
{
if(a.y==b.y)return a.x > b.x;
return a.y > b.y;
}
}tn[N];
int main()
{
int i,j,k,kk,t,x,y,z;
kk=0;
while(scanf("%d",&n)!=EOF&&n)
{
for(i=0,sum=0;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
tn[sum].x=min(x,y);tn[sum].y=max(x,y);tn[sum].z=z;sum++;
tn[sum].x=min(z,y);tn[sum].y=max(z,y);tn[sum].z=x;sum++;
tn[sum].x=min(x,z);tn[sum].y=max(x,z);tn[sum].z=y;sum++;
}
sort(tn,tn+sum);
for(ans=0,i=sum-1;i>=0;i--)
{
for(res=0,j=i+1;j<sum;j++)
if(tn[j].x<tn[i].x&&tn[j].y<tn[i].y&&res<tn[j].z)
res=tn[j].z;
tn[i].z+=res;
ans=max(ans,tn[i].z);
}
printf("Case %d: maximum height = %d\n",++kk,ans);
}
return 0;
}