http://acm.hdu.edu.cn/showproblem.php?pid=1069
#include<stdio.h>
#include<stdlib.h>
typedef struct abc{
int x,y,z;
} abc;
abc a[100];//定义结构体,里边分别存,长宽高;
int k;
int cmp( const void *a,const void *b)
{
abc *c,*d;
c=(abc *)a;
d=(abc *)b;
if(c->x!=d->x)
return c->x-d->x;
else
return c->y-d->y;//对结构体数组进行预处理:即将长进行从小到大的排序;
// 这样可以将问题转换为简单的DP问题;
}
int dp()//类似于求最长上升子序列的问题;
{
int ans,i,j;
for(i=1;i<k;i++)
{
ans=0;//初始化a[i]前满足条件的最大值;
for(j=0;j<i;j++)//进行双重循环,当存在a[i]时,求a[i]及a[i]之前的满足条件的高度和的最大值,把它置为a[i].z;
{
if(a[j].x<a[i].x&&a[i].y>a[j].y&&a[j].z>ans)
{
ans=a[j].z;
}
}
a[i].z=ans+a[j].z;
}
ans=a[0].z;
for(i=1;i<k;i++)
if(a[i].z>ans)
ans=a[i].z;
return ans;
}
int main()
{
int n,i,m=1,t,ans;
while(scanf("%d",&n),n!=0)
{
k=0;
for(i=0;i<n;i++)
{
scanf("%d %d %d",&a[k].x,&a[k].y,&a[k].z);
if(a[k].x!=a[k].z)//像8,9,10这块砖其实可以转换为9,8.10和9,10,8,这三款砖;但
{ //5,5,5就只能是这一块砖,所以就看知否有相同长。宽;
k++;
a[k].x=a[k-1].z;
a[k].y=a[k-1].y;
a[k].z=a[k-1].x;
}
if(a[k].y!=a[k].z)
{
k++;
a[k].x=a[k-1].x;
a[k].y=a[k-1].z;
a[k].z=a[k-1].y;
}
k++;
}
for(i=0;i<k;i++)
{
if(a[i].x>a[i].y)
{
t=a[i].x;
a[i].x=a[i].y;
a[i].y=t;
}
}
qsort(a,k,sizeof(a[0]),cmp);
ans=dp();
printf("Case %d: maximum height = %d\n",m,ans);
m++;
}
return 0;
}