题意:给出n个箱子,及他们的长宽高,求他们叠起来的最大高度(小箱子叠在大箱子上,其两维长宽小于大箱子的两维长款)
思路:一个箱子,可以有六种不同的长宽组合。将其全部列出,再根据最长上升子序列的思想求出最大高度。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct cube
{
int x,y,z;
}c[180];
int n;
int k=0;
int dp[180];
bool cmp(cube c1,cube c2)
{
if(c1.x==c2.x){
if(c1.y==c2.y)
return c1.z<c2.z;
else
return c1.y<c2.y;
}
return c1.x<c2.x;
}
void order(int x,int y,int z)
{
c[k].x=x;
c[k].y=y;
c[k++].z=z;
}
int main()
{
int no=1;
while(scanf("%d",&n)!=EOF&&n)
{
memset(dp,0,sizeof(dp));
int x,y,z;
k=0;
for(int i=0;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
order(x,y,z);
order(x,z,y);
order(y,x,z);
order(y,z,x);
order(z,x,y);
order(z,y,x);
}
sort(c,c+k,cmp);
int ans=0;
for(int i=0;i<k;i++)
{
dp[i]=c[i].z;
for(int j=0;j<i;j++)
{
if(c[j].x<c[i].x&&c[j].y<c[i].y)
dp[i]=max(dp[i],dp[j]+c[i].z);
}
ans=max(ans,dp[i]);
}
printf("Case %d: maximum height = %d\n",no++,ans);
}
}