[CareerCup] 9.10 Stack Boxes 垒箱子问题
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 垒箱子问题的更多相关文章
- [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 ...
- [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 ...
- [CareerCup] 8.10 Implement a Hash Table 实现一个哈希表
8.10 Design and implement a hash table which uses chaining (linked lists) to handle collisions. 这道题让 ...
- [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 ...
- 给jdk写注释系列之jdk1.6容器(10)-Stack&Vector源码解析
前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈. 什么是栈呢,我就不找它具体的定义了,直接举个例子,栈就相当于一个很窄的木桶 ...
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...
- poj 1475 Pushing Boxes 推箱子(双bfs)
题目链接:http://poj.org/problem?id=1475 一组测试数据: 7 3 ### .T. .S. #B# ... ... ... 结果: //解题思路:先判断盒子的四周是不是有空 ...
- CareerCup All in One 题目汇总 (未完待续...)
Chapter 1. Arrays and Strings 1.1 Unique Characters of a String 1.2 Reverse String 1.3 Permutation S ...
- CareerCup All in One 题目汇总
Chapter 1. Arrays and Strings 1.1 Unique Characters of a String 1.2 Reverse String 1.3 Permutation S ...
随机推荐
- 给Macbook装系统的网址
- RunTime(运行时机制)
1>runtime实现的机制是什么,怎么用,一般用于干嘛? 这个问题我就不跟大家绕弯子了,直接告诉大家, runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语 ...
- eclipse 导入新项目后报错:Cannot change version of project facet Dynamic web module to 2.5
错误原因: 我们用Eclipse创建Maven结构的web项目的时候选择了Artifact Id为maven-artchetype-webapp,由于这个catalog比较老,用的servlet还是2 ...
- 编译时:virtual memory exhausted: Cannot allocate memory
一.问题 当安装虚拟机时系统时没有设置swap大小或设置内存太小,编译程序会出现virtual memory exhausted: Cannot allocate memory的问题,可以用swap扩 ...
- 如何自定义Grunt任务
任务(Tasks)是grunt的核心概念,你所做的很多工作比如资源合并(concat).压缩(uglify)都是在配置任务.每次grunt运行的时候,你指定的一个或多个任务也在运行,如果你没有指定任务 ...
- UVA 11355 Cool Points(几何)
Cool Points We have a circle of radius R and several line segments situated within the circumference ...
- java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法
在java中用aes256进行加密,但是发现java里面不能使用PKCS7Padding,而java中自带的是PKCS5Padding填充,那解决办法是,通过BouncyCastle组件来让java里 ...
- jQuery 获取页面元素的属性值
获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 : $(window).width(); 获取页面的文档高度 ...
- String to Integer (atoi)
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- Webpack+React+ES6入门指南[转]
React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React,组件化似乎不再步履蹒跚,有了Reac ...