9.10 You have a stack of n boxes, with widths w., heights hir and depths drThe boxes cannot be rotated and can only be stacked on top of one another if each box in the stack is strictly larger than the box above it in width, height, and depth. Implement a method to build the tallest stack possible, where the height of a stack is the sum of the heights of each box.

开始看到这题时,以为是3.4 Towers of Hanoi 汉诺塔,其实不太一样,这道题只是单纯的让我们垒箱子而已,大的在最底下,问我们能垒出的最大高度是多少。也是一道用递归来解的题,首先我们要先实现箱子类Box,里面包含了箱子的尺寸宽,高和深度,然后还要有一个成员函数canBeAbove,用来判断当前箱子能否放到另一个箱子的上面,还有一个静态函数,是求一摞箱子的总高度的。然后我们对每个箱子都调用一次递归,然后维护一个最大值,每次递归都更新这个最大值,那么最终递归结束后这个最大值就是所求,参见代码如下:

解法一:

class Box {
public:
int _width, _depth, _height;
Box(int w, int d, int h): _width(w), _depth(d), _height(h) {}
bool canBeAbove(Box *bottom) {
if (bottom == nullptr) return true;
return _width > bottom->_width && _depth > bottom->_depth && _height > bottom->_height;
}
static int stackHeight(vector<Box*> stack) {
int res = ;
for (auto &a : stack) {
res += a->_height;
}
return res;
}
}; class Solution {
public:
vector<Box*> createStack(vector<Box*> boxes) {
return createStack(boxes, nullptr);
}
vector<Box*> createStack(vector<Box*> boxes, Box *bottom) {
vector<Box*> res;
int max_height = ;
for (auto &a : boxes) {
if (a->canBeAbove(bottom)) {
vector<Box*> new_stack = createStack(boxes, a);
int new_height = Box::stackHeight(new_stack);
if (new_height > max_height) {
res = new_stack;
max_height = new_height;
}
}
}
if (bottom != nullptr) res.push_back(bottom);
return res;
}
};

上述代码虽然正确,但是不高效,像之前那道9.8 Represent N Cents 美分的组成一样,我们也可以用哈希表来优化,保存我们之前算过的最优解,那么在递归调用需要相同的结果时,就可以直接从哈希表中调用,参见代码如下:

解法二:

class Solution {
public:
vector<Box*> createStack(vector<Box*> boxes) {
unordered_map<Box*, vector<Box*> > m;
return createStack(boxes, nullptr, m);
}
vector<Box*> createStack(vector<Box*> &boxes, Box *bottom, unordered_map<Box*, vector<Box*> > &m) {
if (bottom != nullptr && m.find(bottom) != m.end()) {
return m[bottom];
}
vector<Box*> res;
int max_height = ;
for (auto &a : boxes) {
if (a->canBeAbove(bottom)) {
vector<Box*> new_stack = createStack(boxes, a, m);
int new_height = Box::stackHeight(new_stack);
if (new_height > max_height) {
res = new_stack;
max_height = new_height;
}
}
}
if (bottom != nullptr) {
res.push_back(bottom);
m[bottom] = res;
}
return res;
}
};

[CareerCup] 9.10 Stack Boxes 垒箱子问题的更多相关文章

  1. [CareerCup] 18.10 Word Transform 单词转换

    18.10 Given two words of equal length that are in a dictionary, write a method to transform one word ...

  2. [CareerCup] 17.10 Encode XML 编码XML

    17.10 Since XML is very verbose, you are given a way of encoding it where each tag gets mapped to a ...

  3. [CareerCup] 8.10 Implement a Hash Table 实现一个哈希表

    8.10 Design and implement a hash table which uses chaining (linked lists) to handle collisions. 这道题让 ...

  4. [CareerCup] 13.10 Allocate a 2D Array 分配一个二维数组

    13.10 Write a function in C called my2DAlloc which allocates a two-dimensional array. Minimize the n ...

  5. 给jdk写注释系列之jdk1.6容器(10)-Stack&Vector源码解析

    前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈.      什么是栈呢,我就不找它具体的定义了,直接举个例子,栈就相当于一个很窄的木桶 ...

  6. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索

    题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...

  7. poj 1475 Pushing Boxes 推箱子(双bfs)

    题目链接:http://poj.org/problem?id=1475 一组测试数据: 7 3 ### .T. .S. #B# ... ... ... 结果: //解题思路:先判断盒子的四周是不是有空 ...

  8. CareerCup All in One 题目汇总 (未完待续...)

    Chapter 1. Arrays and Strings 1.1 Unique Characters of a String 1.2 Reverse String 1.3 Permutation S ...

  9. CareerCup All in One 题目汇总

    Chapter 1. Arrays and Strings 1.1 Unique Characters of a String 1.2 Reverse String 1.3 Permutation S ...

随机推荐

  1. Cocos2d-x 基础元素

    看过本章,然后实践之后,应该会掌握以下的认识: 1.Cocos2d-x引擎的基本运转过程 2.Cocos2d-x引擎的一些初始设置 3.对导演及图层及现实对象的认识 4.如何定义自己的显示对象 *:f ...

  2. DP大作战——多重背包

    题目描述 在之前的上机中,零崎已经出过了01背包和完全背包,也介绍了使用-1初始化容量限定背包必须装满这种小技巧,接下来的背包问题相对有些难度,可以说是01背包和完全背包的进阶问题. 多重背包:物品可 ...

  3. SAM4E单片机之旅——17、通过UART进行标准IO

    交互还是很有必要的,而且使用键盘和显示器的交互效率还是很高的.当然,可以直接使用UART进行字符的输入和输出.但是又何必浪费了C的标准输入输出的格式控制之类的功能呢? 这次内容就是使用scanf() ...

  4. 用Leangoo做敏捷需求管理-敏捷团队协作

    传统的瀑布工作模式使用详细的需求说明书来表达需求,需求人员负责做需求调研,根据调研情况编制详细的需求说明书,进行需求评审,评审之后签字确认交给研发团队设计开发.在这样的环境下,需求文档是信息传递的主体 ...

  5. 2013MPD上海6.23 PM 光耀:读心术,用户心理的产品之道

    创新的前提是:制度与组织的创新!!!!!!!!!!!!!! 光耀:腾讯互联网业务产品经理(腾讯公司互联网业务系统产品经理.在电子商务.社会化媒体等方面有深入研究.参与腾讯多个重要项目产品工作) 什么是 ...

  6. 深入PHP内核之面向对象总结

    很久以前看过的,今天总结一下 一.PHP中创建一个类 在PHP中创建一个简单的类是这样的: <?php $obj = new test($url) ?> 二.zend_class_entr ...

  7. Fragment学习笔记

    Fragment为大量型号,尺寸,分辨率的设备提供了一种统一的UI优化方案.将Activity分解为多个Fragment,将极大地提高UI的灵活性,也更容易为一些新的设备配置带来更好的用户体验. on ...

  8. [转]WCDMA系统结构及关键技术

    本文转自:http://blog.csdn.net/lele52141/article/details/8498951 WCDMA系统结构: CN指核心网,UTRAN接入网,UE用户设备. UTRAN ...

  9. 使用jmx监控tomcat

    1.在tomcat启动过程中,开启相应的参数配置: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -D ...

  10. cri-o pod 创建源码分析

    1. server/sandbox.go // RunPodSandbox creates and runs a pod-level sandbox func (s *Server) RunPodSa ...