堆箱子

【转】http://blog.csdn.net/shangqing1123/article/details/47661389

/**
 * 功能:给你一堆n个箱子,箱子宽wi,高hi,深di。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。
 * 实现方法:搭出最高的一堆箱子,箱子堆的高度为每个箱子高度的总和。

*/

两种方法:

方法一:递归法

[java] view plain copy

  1. //递归法
  2. public static ArrayList<Box> createStackR(Box[] boxes,Box bottom){
  3. int maxHeight=0;
  4. ArrayList<Box> maxStack=null;
  5. for(int i=0;i<boxes.length;i++){
  6. if(boxes[i].canBeAbove(bottom)){
  7. ArrayList<Box> newStack=createStackR(boxes,boxes[i]);
  8. int newHeight=stackHeight(newStack);
  9. if(newHeight>maxHeight){
  10. maxHeight=newHeight;
  11. maxStack=newStack;
  12. }
  13. }
  14. }
  15. if(maxStack==null)
  16. maxStack=new ArrayList<Box>();
  17. if(bottom!=null)
  18. maxStack.add(0,bottom);
  19. return maxStack;
  20. }
  21. public static int stackHeight(ArrayList<Box> stack){
  22. int height=0;
  23. for(int i=0;i<stack.size();i++){
  24. height+=stack.get(i).heigth;
  25. }
  26. return height;
  27. }

方法二:动态规划

[java] view plain copy

  1. //动态规划
  2. public static ArrayList<Box> createStackDP(Box[] boxes,Box bottem,HashMap<Box,ArrayList<Box>> stackMap){
  3. if(bottem!=null&&stackMap.containsKey(bottem))
  4. return stackMap.get(bottem);
  5. int maxHeight=0;
  6. ArrayList<Box> maxStack=null;
  7. for(int i=0;i<boxes.length;i++){
  8. if(boxes[i].canBeAbove(bottem)){
  9. ArrayList<Box> newStack=createStackDP(boxes, boxes[i], stackMap);
  10. int newHeight=stackHeight(newStack);
  11. if(newHeight>maxHeight){
  12. maxStack=newStack;
  13. maxHeight=newHeight;
  14. }
  15. }
  16. }
  17. if(maxStack==null)
  18. maxStack=new ArrayList<Box>();
  19. if(bottem!=null)
  20. maxStack.add(0, bottem);
  21. stackMap.put(bottem, maxStack);
  22. /**
  23. * 方法clone()来自Object类,其方法签名如下:重写方法时,可以调整参数,但不得改动返回类型。
  24. * 因此,如果继承自Object的类重写了clone()方法,它的clone()方法仍将返回Object实例。因此必须转型返回值。
  25. */
  26. return (ArrayList<Box>) maxStack.clone();//返回副本
  27. }
  28. lt;pre name="code" class="java"><pre name="code" class="java"> public static int stackHeight(ArrayList<Box> stack){
  29. int height=0;
  30. for(int i=0;i<stack.size();i++){
  31. height+=stack.get(i).heigth;
  32. }
  33. return height;
  34. }


箱子

[java] view plain copy

    1. class Box{
    2. int width;
    3. int heigth;
    4. int depth;
    5. public Box(int width,int heigth,int depth){
    6. this.width=width;
    7. this.heigth=heigth;
    8. this.depth=depth;
    9. }
    10. public boolean canBeAbove(Box box){
    11. if(box.width>this.width&&box.heigth>this.heigth&&box.depth>this.depth)
    12. return true;
    13. return false;
    14. }
    15. }
时间: 2024-11-05 02:29:13

堆箱子的相关文章

ACM_堆箱子咯

堆箱子咯 Time Limit: 2000/1000ms (Java/Others) Problem Description: 双十一大家都在买买买,可忙坏了快递小哥了.zl和皮卡鸡在大伙在剁手的时候,偷偷去快递公司那当兼职赚钱了.zl将箱子一个个叠起来,皮卡鸡将那堆箱子搬到别的地方去,但由于箱子太重,他每次只能拿最上面的一个.zl一边叠箱子,皮卡鸡就一边把目前最上面的箱子搬走,但由于动作快慢不一,有时候zl叠了几个箱子皮卡鸡才搬走一个,有时候皮卡鸡搬走几个箱子,zl才叠上去一个--那么问题来了

9.9递归和动态规划(十)——堆箱子

/** * 功能:给你一堆n个箱子,箱子宽wi,高hi,深di.箱子不能翻转,将箱子堆起来时,下面箱子的宽度.高度和深度必须大于上面的箱子. * 实现方法:搭出最高的一堆箱子,箱子堆的高度为每个箱子高度的总和. */ 两种方法: 方法一:递归法 //递归法 public static ArrayList<Box> createStackR(Box[] boxes,Box bottom){ int maxHeight=0; ArrayList<Box> maxStack=null;

bzoj4950

[Wf2017]Mission Improbable Time Limit: 1 Sec  Memory Limit: 1024 MBSubmit: 105  Solved: 49[Submit][Status][Discuss] Description 那是春日里一个天气晴朗的好日子,你准备去见见你的老朋友Patrick,也是你之前的犯罪同伙.Patrick在编程竞赛 上豪赌输掉了一大笔钱,所以他需要再干一票.为此他需要你的帮助,虽然你已经金盆洗手了.你刚开始很不情愿, 因为你一点也不想再回到

平面分拆的 Macmahon 公式

首先看一个计数问题:一个边长为 $a\times b\times c$ 的平行六边形,每个内角都是 120 度.用边长为 1 的菱形去覆盖,有多少种不同的方法? 比如下图就是一种: 我们从上方俯视这张图(虽然这是一个平面图形,但是我们想象在空间中鸟瞰它),发现它很像是在墙角堆箱子:在一个边长为 $a\times b\times c$ 的长方体空间中堆放若干形状为单位正方体的 "箱子".不仅如此,箱子堆放的规则是有限制的:紧贴墙角处的那一摞箱子最高,从墙角向外,箱子的高度是递减的.这个规

Bzoj 4950 (二分图最大匹配)

Description 那是春日里一个天气晴朗的好日子,你准备去见见你的老朋友Patrick,也是你之前的犯罪同伙.Patrick在编程竞赛 上豪赌输掉了一大笔钱,所以他需要再干一票.为此他需要你的帮助,虽然你已经金盆洗手了.你刚开始很不情愿, 因为你一点也不想再回到那条老路上了,但是你觉得听一下他的计划也无伤大雅.在附近的一个仓库里有一批货物, 包含一些贵重的消费性部件,Patrick企图从中尽可能多地偷些东西出来.这意味着要找一条进去的路,弄晕安保人 员,穿过各种各样的激光射线,你懂的,都是

Codeforces 551C - GukiZ hates Boxes(二分加贪心)

题意: 就是n个学生帮助教授搬箱子, 箱子分成m 堆, 每个学生每秒可以选择的两个操作 操作1,为从i堆迈向第i+1堆, 操作2,从i-1堆箱子中帮忙抱走一个箱子 问抱走所有箱子的最少时间为多少, 每个学生每秒可以同时行动 题解: 二分时间   然后再当前时间下,一个一个派出所有的学生,使其走到他能走的最远距离 代码: #include<stdio.h> int flag, value[100005], value2[100005], n, m; void find(long long int

codeforces 551 C GukiZ hates Boxes

--睡太晚了...脑子就傻了-- 这个题想的时候并没有想到该这样-- 题意大概是有n堆箱子从左往右依次排列,每堆ai个箱子,有m个人,最开始都站在第一个箱子的左边, 每一个人在每一秒钟都必须做出两种选择中的一种:1若他的位置有箱子则搬走一个箱子,2往右走一步. 问把所有箱子都搞掉的最少时间-- 很显然二分一下答案,若为x秒,则每个人都有x秒,一个一个排出去搬,看是否能够搬完-- 我竟然没想到-- #include<map> #include<string> #include<

组合数学漫游奇境记:Schur 多项式,Hook 长度公式,Macmahon 平面分拆公式

Young 表上的组合学是代数组合学中最奇妙的部分,与表示论,统计力学,概率论有着丰富而深刻的联系.这篇文章将从几个有趣的问题开始,带领大家走进这个美丽的领域.所需要的预备知识很少,学过线性代数即可,但是要真正领略其中风光,数学上的成熟是必不可少的. 需要事先剧透的是,本文要证明的几个定理绝非泛泛,它们都是代数组合学中的著名结论. 先来看几个问题: 有 $m$ 位总统候选人参加大选,他们每个人分别有 $\lambda_1,\ldots,\lambda_m$ 位支持者(假定选民只投票给他支持的候选

杭电OJ_hdu2821_Pusher

题目大意: 在http://www.hacker.org/push网站上,有一个名字叫PusherBoy的游戏.这个游戏给出一个R * C的棋盘,棋盘上有许多堆阻碍前进的箱子.游戏的胜利条件是通过推箱子的方式,清除掉棋盘上所有的箱子. 现在你需要选择一块空旷的区域作为PusherBoy的初始位置,然后选择一个方向(U代表向上,D代表向下,L代表向左,R代表向右)来推箱子.一旦你选好了一个方向,PusherBoy将一直向前走直到碰到箱子才停下来(不能走出棋盘),然后他从这堆箱子中移除一个箱子(当然