题意:给定 n 种 长方体的三维长度,每种有无限个,让你堆成塔,相邻两个长方体下面的那个长和宽严格大于上面的长和宽,求最高可堆积的高度;
分析:每种长方体有六种摆放方式,我们把所有长方体的所有摆放方式按长宽从小到大排序,设dp[i] 表示以排序后的第 i 个长方体为底部能堆积的最高高度,则往前找比它长宽严格小的更新就可以了,即:
代码:
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pb push_back
using namespace std;
const int N = 1000;
int dp[N];
struct node{
int r,c,h;
node(){}
node(int _r,int _c,int _h){
r=_r,c=_c,h=_h;
}
bool operator < (const node& a)const{
if(a.r==r) return c<a.c;
return r<a.r;
}
};
int main()
{
int n,T=0;
while(~scanf("%d",&n)&&n){
memset(dp,0,sizeof(dp));
vector<node>s;
for(int i=1;i<=n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
s.pb(node(x,y,z));
s.pb(node(y,x,z));
s.pb(node(x,z,y));
s.pb(node(z,x,y));
s.pb(node(y,z,x));
s.pb(node(z,y,x));
}
sort(s.begin(),s.end());
n*=6;
int ANS=0;
for(int i=0;i<n;i++){
dp[i]=s[i].h;
for(int j=i-1;j>=0;j--){
if(s[j].r<s[i].r&&s[j].c<s[i].c){
dp[i]=max(dp[i],dp[j]+s[i].h);
}
}
ANS=max(ANS,dp[i]);
}
printf("Case %d: maximum height = %d\n",++T,ANS);
}
}