HD-106906B,hdu1166

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: