题意:给出多种方块,问在满足下一层方块比上一层方块的长宽都大的情况下,这个叠方块最大能有多高。
思路:根据题意要把能放的长方形放在上面,这就有状态转移的感觉,于是我们就把长方形由小到大排好序,从最小到最大按照dp【i】=max(dp【i】,dp【j】+height【i】)的状态转移方程遍历,最后输出最大的高度即可,此外要注意一种尺寸的长方形可以得到六种长宽高不同的长方形。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node
{
int l,w,h;
}bl[227];
int dp[227];
bool cmp(node a,node b)
{
if(a.l==b.l){
return a.w<b.w;
}
else {
return a.l<b.l;
}
}
int main()
{
int n;
int cas=0;
while(scanf("%d",&n)&&n){
int a,b,c;
int cnt=0;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&a,&b,&c);
bl[++cnt].l=a;bl[cnt].w=b;bl[cnt].h=c;
bl[++cnt].l=a;bl[cnt].w=c;bl[cnt].h=b;
bl[++cnt].l=b;bl[cnt].w=a;bl[cnt].h=c;
bl[++cnt].l=b;bl[cnt].w=c;bl[cnt].h=a;
bl[++cnt].l=c;bl[cnt].w=a;bl[cnt].h=b;
bl[++cnt].l=c;bl[cnt].w=b;bl[cnt].h=a;
}
sort(bl+1,bl+1+cnt,cmp);
for(int i=1;i<=cnt;i++){
dp[i]=bl[i].h;
for(int j=1;j<i;j++){
if(bl[i].l>bl[j].l&&bl[i].w>bl[j].w){
dp[i]=max(dp[j]+bl[i].h,dp[i]);
}
}
}
sort(dp+1,dp+1+cnt);
printf("Case %d: maximum height = %d\n",++cas,dp[cnt]);
}
}