就是给定一个三个值作为立方体的长宽高三个属性(故给定一个就有三种组合方式)
然后底完全大于下边的就可以放上去(就是长宽都严格大于下边的)
求最高的高度
就是先将其排个序,判断是否能放上。dp[i]代表以i为顶的最高的高度,状态转移方程为:
if(L[i].chang>L[j].chang&&L[i].kuan>L[j].kuan) dp[i]=max(dp[i],dp[j]+L[i].gao);
代码:
#include<bits/stdc++.h>
using namespace std;
int dp[1010];
struct node
{
int chang,kuan,gao;
}L[1010];
bool cmp(node a,node b)
{
return a.chang*a.kuan<b.chang*b.kuan;
}
int main()
{
int n;
int num=0;
int a,b,c;
int cas=0;
while(scanf("%d",&n)){
num=0;
if(n==0)
break;
cas++;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&a,&b,&c);
L[++num].chang=a,L[num].kuan=b,L[num].gao=c;
L[++num].chang=a,L[num].kuan=c,L[num].gao=b;
L[++num].chang=b,L[num].kuan=a,L[num].gao=c;
L[++num].chang=b,L[num].kuan=c,L[num].gao=a;
L[++num].chang=c,L[num].kuan=a,L[num].gao=b;
L[++num].chang=c,L[num].kuan=b,L[num].gao=a;
}
sort(L+1,L+1+num,cmp);
int maxx=0;
memset(dp,0,sizeof(dp));
for(int i=1;i<=6*n;i++){//表示到顶为i块的最大的高度
dp[i]=L[i].gao;
for(int j=1;j<i;j++){
if(L[i].chang>L[j].chang&&L[i].kuan>L[j].kuan)
dp[i]=max(dp[i],dp[j]+L[i].gao);
}
//cout<<dp[i]<<"%%%"<<endl;
maxx=max(maxx,dp[i]);
}
cout<<"Case "<<cas<<": maximum height = "<<maxx<<endl;
}
return 0;
}