题意:给n个 维度为(x,y,z)的 立方体,垒起来,要求下层长宽严格大于上层,求最大高度
解:一个长方体理论上有6种方法,n最大30,30*6数据较小。有些特殊情况不做处理。
dp[i] 表示使用第 i 个长方体的最大高度。宽相同按照长从小到大排序,否则按照宽从小到大排序。
最后遍历取最大值
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct No{
int x,y,z;
}no[200];
int cnt = 0;
int dp[200];
void add(int x,int y,int z){
no[cnt].x = x; no[cnt].y = y;
no[cnt++].z = z;
}
int cmp(No a,No b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
int main()
{
int n,x,y,z,maxh,num=0;
while(scanf("%d",&n)&&n){
cnt = 0;
for(int i=0;i<n;i++){
scanf("%d %d %d",&x,&y,&z);
add(x,y,z); add(x,z,y);
add(z,x,y); add(z,y,x);
add(y,x,z); add(y,z,x);
}
sort(no,no+cnt,cmp);
for(int i=0;i<cnt;i++){
maxh = 0;
for(int j=0;j<i;j++){
if(no[i].x>no[j].x&&no[i].y>no[j].y)
maxh=maxh>dp[j]?maxh:dp[j];
}
dp[i]=no[i].z+maxh;
}
int ans = 0;
for(int i=0;i<cnt;i++)
ans=max(ans,dp[i]);
printf("Case %d: maximum height = %d\n",++num,ans);
}
return 0;
}