这道题需要考虑到一个长方体三条边随意组合可以有六种摆放方式,所以接受一次数据需要入栈六次,一开始我看30的范围只开了50的结构体,后来想到要乘六。
状态转移方程我是用dp[i]记录到第i个长方体的高度,dp[i]=max(dp[i],dp[j]+tmp[i]);这是比较出到i个长方体最高的,因为第i个长方体(tmp[i])有可能加在任何一个符合条件的之前的长方体上(dp[j]),所以dp[i]存的是搜到j长方体之前的最高高度,和当前搜到的j长方体比较,最大值就是当前长方体(tmp[i])加上之后的最高值。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int x,y,z;
void init(int a,int b,int c)
{
x=a;
y=b;
z=c;
}
}tmp[300];
int cmp(node a,node b)
{
return a.x*a.y>b.x*b.y;
}
int main()
{
int dp[300];
int n;
int cas=0;
while(scanf("%d",&n)!=EOF)
{
memset(dp,0,sizeof(dp));
if(n==0)
{
break;
}
int tot=0;
for(int i=0;i<n;i++)
{
int ix,iy,iz;
scanf("%d%d%d",&ix,&iy,&iz);
tmp[tot++].init(ix,iy,iz);
tmp[tot++].init(ix,iz,iy);
tmp[tot++].init(iy,ix,iz);
tmp[tot++].init(iy,iz,ix);
tmp[tot++].init(iz,iy,ix);
tmp[tot++].init(iz,ix,iy);
}
sort(tmp,tmp+tot,cmp);
int item=0;
for(int i=0;i<tot;i++)
{
dp[i]=tmp[i].z;
for(int j=0;j<i;j++)
{
if(tmp[i].x<tmp[j].x&&tmp[i].y<tmp[j].y)
{
dp[i]=max(dp[i],dp[j]+tmp[i].z);
}
}
if(item<dp[i])
{
item=dp[i];
}
}
cas++;
printf("Case %d: maximum height = %d\n",cas,item);
}
}