*/
两种方法:
方法一:递归法
//递归法 public static ArrayList<Box> createStackR(Box[] boxes,Box bottom){ int maxHeight=0; ArrayList<Box> maxStack=null; for(int i=0;i<boxes.length;i++){ if(boxes[i].canBeAbove(bottom)){ ArrayList<Box> newStack=createStackR(boxes,boxes[i]); int newHeight=stackHeight(newStack); if(newHeight>maxHeight){ maxHeight=newHeight; maxStack=newStack; } } } if(maxStack==null) maxStack=new ArrayList<Box>(); if(bottom!=null) maxStack.add(0,bottom); return maxStack; } public static int stackHeight(ArrayList<Box> stack){ int height=0; for(int i=0;i<stack.size();i++){ height+=stack.get(i).heigth; } return height; }
方法二:动态规划
//动态规划 public static ArrayList<Box> createStackDP(Box[] boxes,Box bottem,HashMap<Box,ArrayList<Box>> stackMap){ if(bottem!=null&&stackMap.containsKey(bottem)) return stackMap.get(bottem); int maxHeight=0; ArrayList<Box> maxStack=null; for(int i=0;i<boxes.length;i++){ if(boxes[i].canBeAbove(bottem)){ ArrayList<Box> newStack=createStackDP(boxes, boxes[i], stackMap); int newHeight=stackHeight(newStack); if(newHeight>maxHeight){ maxStack=newStack; maxHeight=newHeight; } } } if(maxStack==null) maxStack=new ArrayList<Box>(); if(bottem!=null) maxStack.add(0, bottem); stackMap.put(bottem, maxStack); /** * 方法clone()来自Object类,其方法签名如下:重写方法时,可以调整参数,但不得改动返回类型。 * 因此,如果继承自Object的类重写了clone()方法,它的clone()方法仍将返回Object实例。因此必须转型返回值。 */ return (ArrayList<Box>) maxStack.clone();//返回副本 } <pre name="code" class="java"><pre name="code" class="java"> public static int stackHeight(ArrayList<Box> stack){ int height=0; for(int i=0;i<stack.size();i++){ height+=stack.get(i).heigth; } return height; }
class Box{ int width; int heigth; int depth; public Box(int width,int heigth,int depth){ this.width=width; this.heigth=heigth; this.depth=depth; } public boolean canBeAbove(Box box){ if(box.width>this.width&&box.heigth>this.heigth&&box.depth>this.depth) return true; return false; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/shangqing1123/article/details/47661389