HD-106906B,hdu1166
猴子和香蕉
时间限制:2000/1000毫秒(Java/其他)内存限制:65536/32768K(Java/其他)
提交总数:4975被接受的提交数:2548
问题描述
一组研究人员正在设计一项测试猴子智商的实验。他们会把一根香蕉挂在屋顶上,同时给猴子一些积木。如果猴子足够聪明,它应该能够够到香蕉,通过把一块积木放在另一块积木上来建造一个塔,然后爬上去得到它喜欢的食物。
研究人员有n种积木,每种积木都有无限量供应。每个我型块体是一个具有线性维数的长方体(、易、子)。一块砖可以重新定向,这样它的三个维度中的任何两个维度确定了底部的维度,而另一个维度是高度。
他们想确保用积木堆砌的最高的塔能到达屋顶。问题是,在建造一座塔时,一个积木只能放在另一个积木的上面,只要上面积木的两个底部尺寸都严格小于下面积木的相应底部尺寸,因为必须有一些空间让猴子踩上去。这意味着,例如,具有相同大小底座的积木不能堆叠在一起。
你的工作是写一个程序,确定猴子用一组给定的积木可以建造的最高的塔的高度。
输入文件将包含一个或多个测试用例。每个测试用例的第一行包含一个整数n,
表示下面数据集中不同块的数量…n。的最大值是30。
接下来的n行中的每一行包含三个整数,分别代表值、易和子.
n的值为零(0)时,输入终止。
对于每个测试案例,打印一行包含案例编号(从一开始按顺序编号)和最高的可能塔的高度,格式为"案例案例:最大高度=高度"。
解题思路:类似于最长上升子序列,把箱子拆成3*n个,这样相当于把一个箱子分成高度不同的3个,按底面积从小到大排好,根据转移方程DP[I]=max { DP[j]} c[I](1=j I a[I]a[j]b[I]b[j]),其中dp[i]表示前我个箱子能堆起的最大高度包含输入输出流
#包括cstdio
#包括字符串
#包含算法
使用命名空间标准
结构稀有
int a;
int b;
int c;
int s;
} r[200];
布尔化学机械抛光(右上,右下)
返回美国
int main()
int m=1,n,I,j,k,l,w,h,dp[200],temp,ans
while(scanf(%d ,n)!=-1 n)
ans=0;
memset(dp,0,sizeof(DP));
k=1;
for(I=1;我我)
scanf(%d%d%d ,l,w,
r[k].a=l;r[k].b=w;r[k].c=h;r[k].s=r[k].阿*r[k].b;
k;
r[k].a=w;r[k].b=l;r[k].c=h;r[k].s=r[k].阿*r[k].b;
k;
r[k].a=h;r[k].b=l;r[k].c=w;r[k].s=r[k].阿*r[k].b;
k;
r[k].a=h;r[k].b=w;r[k].c=l;r[k].s=r[k].阿*r[k].b;
k;
r[k].a=l;r[k].b=h;r[k].c=w;r[k].s=r[k].阿*r[k].b;
k;
r[k].a=w;r[k].b=h;r[k].c=l;r[k].s=r[k].阿*r[k].b;
k;
sort(r 1,r k,CMP);
dp[1]=r[1].c;
for(I=1;我我)
temp=0;
for(j=1;j j)
if(r[i].一个r[j].一个r[i].b r[j].b温度dp[j])
temp=DP[j];
DP[I]=温度r[i].c;
for(I=1;我我)
if(ans dp[i])
ans=DP[I];
printf(案例%d:最大高度=%d\n ,m,ans);
返回0;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。