题意:
用n种长方体建楼问如何最高,要求上面的长方体的长宽要严格的小于下方的长方体
分析:
一个长方体有3种情况,那么对3*n个长方体按面积排序,对得到的序列以长和宽为标准求一个最长上升子序列的和就ok
ACcode:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#define maxn 10100
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
struct N{
int a,b;
int s;
int h;
void add(int x,int y,int z){
a=min(x,y);
b=max(x,y);
s=x*y;
h=z;
}
bool operator <(const N &tmp)const{
return s>tmp.s;
}
}my[maxn];
int dp[maxn];
int main(){
int n,cnt=1;
while(scanf("%d",&n)&&n){
int tot=0;
for(int i=1;i<=n;++i){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
my[tot++].add(a,b,c);
my[tot++].add(a,c,b);
my[tot++].add(c,b,a);
}
sort(my,my+tot);
int ans=0;
for(int i=0;i<tot;++i){
dp[i]=my[i].h;
for(int j=0;j<i;++j)
if(my[i].a<my[j].a&&my[i].b<my[j].b)
dp[i]=max(dp[i],dp[j]+my[i].h);
ans=max(ans,dp[i]);
}
printf("Case %d: maximum height = %d\n",cnt++,ans);
}
return 0;
}