9.10 n个箱子,宽w、高h、深d,箱子不能翻转,下面的箱子的宽度、高度和深度必须大于上面的,实现一个方法,搭出最高的一堆箱子。

递归求解,求出已某个箱子为底,返回最高可以放的箱子堆。

DP思想优化,对于已经求过的已某个箱子为底的情况,用一个map记录下来,以后直接返回即可。

  注意一些clone等一些语言细节。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Solution {

    public ArrayList<Box> maxHeight(Box[] boxes) {
        Map<Box, ArrayList<Box>> cache = new HashMap<Box, ArrayList<Box>>();
        return maxHeight(boxes, null, cache);
    }

    private ArrayList<Box> maxHeight(Box[] boxes, Box bottom, Map<Box, ArrayList<Box>> cache) {
        // 用于实现DP的思想,注意每个返回值要clone一份,否则返回去之后cache中结果也会被外界引用的改变而改变。
        if (cache.containsKey(bottom))
            return (ArrayList<Box>) cache.get(bottom).clone();
        int maxHeight = 0;
        ArrayList<Box> res = new ArrayList<Box>();
        for (int i = 0; i < boxes.length; i++) {
            if (boxes[i].canAbove(bottom)) {
                // 递归求解上面的箱子
                ArrayList<Box> tmp = maxHeight(boxes, boxes[i], cache);
                // 计算堆的高度
                int curHeight = calcu(tmp);
                if (curHeight > maxHeight) {
                    curHeight = maxHeight;
                    res = tmp;
                }
            }
        }

        // 当前箱子加进去
        if (bottom != null)
            res.add(bottom);
        // 结果放入cache中用于dp
        cache.put(bottom, res);

        return res;

    }

    private int calcu(List<Box> list) {
        int res = 0;
        for (Box each : list) {
            res += each.h;
        }
        return res;
    }

    public static void main(String[] args) {
        Box[] boxes = { new Box(3, 4, 1), new Box(8, 6, 2), new Box(7, 8, 3) };
        System.out.println(new Solution().maxHeight(boxes));

    }
}

class Box {
    int w;
    int h;
    int d;

    public Box(int w, int h, int d) {
        this.w = w;
        this.h = h;
        this.d = d;
    }

    boolean canAbove(Box b) {
        if (b == null)
            return true;
        return w < b.w && h < b.h && d < b.d;
    }

    @Override
    public String toString() {
        return "Box [w=" + w + ", h=" + h + ", d=" + d + "]";
    }

}
时间: 2024-10-18 03:08:41

9.10 n个箱子,宽w、高h、深d,箱子不能翻转,下面的箱子的宽度、高度和深度必须大于上面的,实现一个方法,搭出最高的一堆箱子。的相关文章

img图片自适应宽和高[转]

控制缩略图常见的是JS来控制,还有就是最直接的方法定义img的宽高:下面两种方法自适应宽和高,zhenzhai推荐使用CSS方法:一.CSS方法:主 要是在CSS设置最小值和最大值(max-width: 100px; max- height: 100px; width: expression(this.width >100 && this.height < this.width ? 100: true); height: expression(this.height > 

Android 获得view的宽和高

转自:http://blog.csdn.net/yangdeli888/article/details/25405263 在oncreate()中利用view.getWidth()或是view.getHeiht()来获取view的宽和高,看似没有问题,其实他们去得值是0,并不是你想要的结果? 这是为什么呢? 在调用oncreate()方法时,界面处于不可见状态,内存加载组件还没有绘制出来,你是无法获取他的尺寸. 那如何在绘制组件之前能获取到该组件的尺寸大小呢? 这里有三种方法,经过验证的: 方法

【转】Android 获得view的宽和高

转自:http://blog.csdn.net/yangdeli888/article/details/25405263 Android 获得view的宽和高 分类: android 技术点项目2014-05-09 16:15 6954人阅读 评论(3) 收藏 举报 在oncreate()中利用view.getWidth()或是view.getHeiht()来获取view的宽和高,看似没有问题,其实他们去得值是0,并不是你想要的结果? 这是为什么呢? 在调用oncreate()方法时,界面处于不

Android扩展-怎么在Activity中拿到一个View的宽和高

今天来简单的介绍一下怎么在Activity中拿到View的width和height.有人可能会疑问,这个有什么难的,我们直接可以在Activity生命周期函数里面获取width和height.看似简单,实际上在onCreate.onStart.onResume中均无法获取正确的width和height,这是因为View的measure过程和Activity的生命周期方法不是同步的,因此无法保证Activity执行了onCreate.onStart.onResume时,某个View已经测量完毕,如

图片上传时获取图片的宽和高

经常会遇到图片上传的问题,这时候我们会传图片的地址,宽和高到服务器,至于图片上传就不说了,这里主要说图片上传时获取图片的原始宽和高的问题. 一般而言,我们把图片上传至服务器时,服务器会返回一个上传地址给我们,这个就是我们图片的url了,但是光有这个还是不够的,因为还要将图片的宽和高传给服务器,这时候就可以这样做了.直接上代码: var img = new Image() img.src = url 然后就可以使用img.width和img.height来获取图片的宽和高了.当然仅仅这样做是不够的

C# 压缩图片到指定宽度,假如图片小于指定宽度 判断图片大小是否大于指定大小(KB) 如果大于则压缩图片质量 宽高不变

class Program { static void Main(string[] args) {//G:\zhyue\backup\projects\Test\ConsoleApplication1\img //var url = "http://seo.jrechina.com/houselist/"; //var res = WebRequestExt.GetData(url); string img_url = @"D:\Documents\Pictures\壁纸\1

如何获取Html的height和width属性(网页宽、高)

1.页面如图所示 2.Html代码 <div style="color:green;" id="html_info"></div> 3.JavaScript代码 1 <script type="text/javascript"> 2 var info = ""; 3 info += " 网页可见区域宽:"+ document.body.clientWidth+"

要求用户输入宽和高,显示出长方形的面积。

import java.util.Scanner; /** * @author 蓝色以太 * 要求用户输入宽和高,显示出长方形的面积. */ public class Area { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("请输入长度:"); double length=sc.nextDouble(); System.out.printl

提取了Windows 10 Build 9901 系统自带 高清分辨率壁纸

提取了Windows 10 Build 9901  系统自带 高清分辨率壁纸 下载地址为:http://www.400gb.com/file/81555894