这个题题意难一半。
表示看题看了好久。
题意:给定n种长方体,给定长方体长宽高,每个长方体有无限个,要堆成塔形,问最高能堆多高。下面的必须长宽均大于上面的。
题解:每个长方体怎么放是没有限制的,也就是说一个长方体可以有六种方法(刚开始我对这个存疑,但是亲手摆摆试试就知道了),也就是说我们最多将一个长方体可以扩展成六个,然后排个序,求最长上升子序列就可以了。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct bbq{
int x,y,z;
};
bbq e[205];
int n,num[205];
int cmp(bbq x,bbq y)
{
if(x.x > y.x)return 1;
else if(x.x == y.x && x.y > y.y)return 1;
else return 0;
}
int main()
{
int te = 1;
while(~scanf("%d",&n) && n)
{
int mount = 0;
int a[3];
memset(num,0,sizeof num);
memset(e,0,sizeof e);
for (int i = 0; i < n; i++)
{
scanf("%d %d %d",&a[0],&a[1],&a[2]);
e[mount].x = a[0],e[mount].y = a[1],e[mount++].z = a[2];
e[mount].x = a[0],e[mount].y = a[2],e[mount++].z = a[1];
e[mount].x = a[1],e[mount].y = a[0],e[mount++].z = a[2];
e[mount].x = a[1],e[mount].y = a[2],e[mount++].z = a[0];
e[mount].x = a[2],e[mount].y = a[1],e[mount++].z = a[0];
e[mount].x = a[2],e[mount].y = a[0],e[mount++].z = a[1];
}
sort(e,e + mount,cmp);
for (int i = 0; i < mount; i++)
{
num[i] = e[i].z;
for (int j = 0; j < i; j++)
{
if(e[j].x > e[i].x && e[j].y > e[i].y && num[j] + e[i].z > num[i])
{
num[i] = num[j] + e[i].z;
}
}
}
int ans = 0;
for (int i = 0; i < mount; i++)
{
if(ans < num[i])
ans = num[i];
}
printf("Case %d: maximum height = %d\n",te++,ans);
}
}