描述:
多组输入n,接下来n行每行三个数,分别表示一个长方体的长宽高。每种长方体有无数个。
一个长方体可以搭在另一个长方体的前提条件是(可以是两个完全相同的长方体但是放的姿势不同)
该上面的长方体的长宽分别比下面那个长方体的长宽都短
要求堆的最高。
Ⅰ.简化题意和预处理
长方形每个面都可以作为底面,那我们把六种形态都存下来.
现在的问题就是,在这些长方体中,选出一些长方体来,有点背包的味道。
那我们先按照x,y大小排序,接下来就是类似最大上升子序列的做法了
枚举一个i,代表本次放第i个矩形在底部,然后在1~i-1中找更小的矩形转移即可。
#include <bits/stdc++.h>
using namespace std;
int n;
struct p{
int x,y,z;
}d[609];int dp[609];
bool com(p a,p b){
if(a.x!=b.x) return a.x<b.x;
return a.y<b.y;
}
int main()
{
int k=1;
while(cin>>n&&n)
{
int cnt=1;
int q,w,e,ans=0;
for(int i=1;i<=n;i++)
{
cin>>q>>w>>e;
d[cnt].x=q,d[cnt].y=w,d[cnt++].z=e;
d[cnt].x=w,d[cnt].y=q,d[cnt++].z=e;
d[cnt].x=q,d[cnt].y=e,d[cnt++].z=w;
d[cnt].x=e,d[cnt].y=q,d[cnt++].z=w;
d[cnt].x=w,d[cnt].y=e,d[cnt++].z=q;
d[cnt].x=e,d[cnt].y=w,d[cnt++].z=q;
ans=max(ans,max(q,max(e,w)));
}
sort(d+1,d+cnt,com);
memset(dp,0,sizeof(dp));
for(int i=1;i<cnt;i++)
{
dp[i]=d[i].z;
for(int j=1;j<i;j++)
{
if(d[i].x>d[j].x&&d[i].y>d[j].y)
dp[i]=max(dp[i],dp[j]+d[i].z);
ans=max(ans,dp[i]);
}
}
cout<<"Case "<<k++<<": maximum height = "<<ans<<endl;
}
}