题目大意
有n种长宽高为x,y,z的砖头,每种都有无数个。
砖头可以用不同姿势的方向来盖。
砖头a以某种姿势可以盖在砖头b上,当且仅当a的底部的长宽都要比b的底部长宽要小。
问最高可以建多高?
比较两个blocks就是比较它们的底,且每一种block只会用一次,因此把一个block变为3个。
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)
#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)
typedef long long ll;
typedef pair<int, int> pii;
const int INF =0x3f3f3f3f;
const int maxn=30 ;
int dp[3*maxn+10],n;
struct Block
{
int x,y,z;
Block(){}
Block(int x,int y,int z):x(x),y(y),z(z){}
bool operator<(const Block b)const
{
return x<b.x&&y<b.y||x<b.y&&y<b.x;
}
}b[3*maxn+10];
int DP(int x)
{
if(dp[x]!=-1 ) return dp[x];
dp[x]=b[x].z;
for1(y,n) if(b[x]<b[y])
{
dp[x]=max(dp[x],DP(y)+b[x].z);
}
return dp[x];
}
int main()
{
int kase=0;
while(~scanf("%d",&n)&&n)
{
for1(i,n)
{
scanf("%d%d%d",&b[i].x,&b[i].y,&b[i].z);
int j=i+n;
b[j].z=b[i].y;
b[j].x=b[i].x;
b[j].y=b[i].z;
j+=n;
b[j].z=b[i].x;
b[j].x=b[i].z;
b[j].y=b[i].y;
}
n*=3;
int ans=1;
memset(dp,-1,sizeof dp);
for1(i,n)
{
ans=max(ans,DP(i));
}
printf("Case %d: maximum height = %d\n",++kase,ans);
}
return 0;
}