hdu1069 Monkey and Banana

http://acm.hdu.edu.cn/showproblem.php?pid=1069

一道经典的DP题目,类似于求最长递增子序列吧。

题意:

一堆科学家研究猩猩的智商,给他n个长方体,

然后,将一个香蕉挂在屋顶,让猩猩通过 叠长方体来够到香蕉。

现在给你n个长方体,计算,最高能堆多高。

要求位于上面的长方体的长要大于(注意不是大于等于)下面长方体的长,上面长方体的宽大于下面长方体的宽。

解题:

一个长方体,可以有6种不同的摆法。

例如:

第一个例子: 10 20 30

它有6中摆法:

长  宽    高

10  20  30

20  30  10

30  10  20

10  30  20

20  10  30

30  20  10

然后我们把它排序

排序之后应该是这样的

10 20 30

10 30 10

20 10 30

20 30 10

30 10 20

30 20 10

因为数据中 长方体种类最多30种,也就是说数组最大可以开到 30*6=180 完全可以

然后用dp[i]来存,到第i个木块,最高可以累多高。

当然,长方体先要以长度排序,长度相同则宽度小的在上。

这道题有点难理解

代码:

#include <iostream>
#include <algorithm>
using namespace std;
struct Cuboid //类 
{
  int l,w,h;
} cd[181];

int dp[181];
bool cmp( Cuboid cod1,Cuboid cod2 )
{
  if( cod1.l==cod2.l )	return cod1.w<cod1.w;
  return cod1.l<cod2.l;
}
int main()
{
  int i,j,n,len,t_num=1;
  int z1,z2,z3;
  while( cin>>n && n )
  {
    len=0;
  // 每组数都可以变换为6种长方体
    for(i=0;i<n;++i)
    {
      cin>>z1>>z2>>z3;   //输入3个数,不知道哪个是长宽高,
      cd[len].l=z1,cd[len].w=z2,cd[len++].h=z3;//l是长,w是宽,h是高 
      cd[len].l=z1,cd[len].w=z3,cd[len++].h=z2;
      cd[len].l=z2,cd[len].w=z1,cd[len++].h=z3;
      cd[len].l=z2,cd[len].w=z3,cd[len++].h=z1;
      cd[len].l=z3,cd[len].w=z1,cd[len++].h=z2;
      cd[len].l=z3,cd[len].w=z2,cd[len++].h=z1;
    }

    sort(cd,cd+len,cmp);
    dp[0]=cd[0].h;// 构建dp数组
    int max_h;
    for(i=1;i<len;++i)
    {
      max_h=0;
      for( j=0;j<i;++j)
      {
        if( cd[j].l<cd[i].l && cd[j].w<cd[i].w )
          max_h=max_h>dp[j]?max_h:dp[j]; //比较大小 
      }
      dp[i]=cd[i].h+max_h;  //高度 
    }
    // 再次搜索 所有dp中最大值
    max_h=0;
    for(i=0;i<len;++i)
      if(max_h<dp[i])
        max_h=dp[i];
    cout<<"Case "<<t_num++<<": maximum height = "<<max_h<<endl;
  }
  return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值