careercup-递归和动态规划 9.10
9.10 给你一堆n个箱子,箱子宽w,高h,深d。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。实现一个方法,搭出最高的一堆箱子,箱堆的高度为每个箱子高度的总和。
解法:
要解决此题,我们需要找到不同子问题之间的关系。
假设我们又以下这些箱子:b1、b2,...,bn。能够堆出的最高箱堆的高度等于max(底部为b1的最高箱堆,底部为b2的最高箱堆,...,底部为bn的最高箱堆)。也就是说,只要试着用每个箱子作为箱堆底部并搭出可能的最高高度,就能找出箱对的最高高度。
回溯的实现方法:
#include<iostream>
#include<vector>
using namespace std; struct box
{
int height;
int wide;
int depth;
box(int h,int w,int d):height(h),wide(w),depth(d) {}
}; bool isValid(vector<box> &path,box b)
{
if(path.empty())
return true;
box top=path[path.size()-];
return b.depth<top.depth&&b.height<top.height&&b.wide<top.wide;
} void helper(vector<box> &boxes,vector<box> &path,int &maxHeight)
{
int i;
for(i=;i<boxes.size(); i++)
{
if(isValid(path,boxes[i]))
{
path.push_back(boxes[i]);
helper(boxes,path,maxHeight);
path.pop_back();
}
}
if(i==boxes.size())
{
int j,sum=;
for(j=; j<path.size(); j++)
{
sum+=path[j].height;
}
if(sum>maxHeight)
maxHeight=sum;
return;
}
}
int maxBoxTower(vector<box> &boxes)
{
vector<box> path;
int maxHeight=;
helper(boxes,path,maxHeight);
return maxHeight;
} int main()
{
vector<box> b= {box(,,),box(,,),box(,,),box(,,)};
cout<<maxBoxTower(b)<<endl;
}
careercup-递归和动态规划 9.10的更多相关文章
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目10
2014-03-20 04:15 题目:你有n个盒子,用这n个盒子堆成一个塔,要求下面的盒子必须在长宽高上都严格大于上面的.如果你不能旋转盒子变换长宽高,这座塔最高能堆多高? 解法:首先将n个盒子按照 ...
- 70. Climbing Stairs【leetcode】递归,动态规划,java,算法
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- 算法 递归 迭代 动态规划 斐波那契数列 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 9.9递归和动态规划(八)——给定数量不限的硬币,币值为25分,10分,5分,1分,计算n分有几种表示法
/** * 功能:给定数量不限的硬币.币值为25分,10分.5分.1分,计算n分有几种表示法. */ public static int makeChange(int n){ return make ...
- 面试题目——《CC150》递归与动态规划
面试题9.1:有个小孩正在上楼梯,楼梯有n个台阶,小孩一次可以上1阶.2阶或者3阶.实现一个方法,计算小孩有多少种上楼梯的方式. 思路:第4个数是前三个数之和 注意:能不能使用递归,能不能建立一个很大 ...
- python---通过递归和动态规划策略解决找零钱问题
也是常见套路. # coding = utf-8 def rec_mc(coin_value_list, change, know_results): min_coins = change if ch ...
- OptimalSolution(1)--递归和动态规划(1)斐波那契系列问题的递归和动态规划
一.斐波那契数列 斐波那契数列就是:当n=0时,F(n)=0:当n=1时,F(n)=1:当n>1时,F(n) = F(n-1)+F(n-2). 根据斐波那契数列的定义,斐波那契数列为(从n=1开 ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- Idea 02.暴力递归与动态规划(1)
1,关键词解释 1.1 暴力递归: 1, 把问题转化为规模缩小了的同类问题的子问题 2, 有明确的不需要继续进行递归的条件(base case) 3, 有当得到了子问题的结果之后的决策过程 4, 不记 ...
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目8
2014-03-20 04:04 题目:给你不限量的1分钱.5分钱.10分钱.25分钱硬币,凑成n分钱总共有多少种方法? 解法:理论上来说应该是有排列组合的公式解的,但推导起来太麻烦而且换个数据就又得 ...
随机推荐
- 部署解决方案包 (SharePoint Server 2010)
转:http://technet.microsoft.com/zh-cn/library/cc262995(v=office.14).aspx 本文介绍各个解决方案包,及其在 Microsoft Sh ...
- LinkedList源码解析
LinkedList是基于链表结构的一种List,在分析LinkedList源码前有必要对链表结构进行说明.1.链表的概念链表是由一系列非连续的节点组成的存储结构,简单分下类的话,链表又分为单向链表和 ...
- ReaderWriterLock类(转)
ReaderWriterLock类 通常来讲,一个类型的实例对于并行的读操作是线程安全的,但是并行地更新操作则不是(并 行地读和更新也不是). 这对于资源也是一样的,比如一个文件.当保护类型的实例安全 ...
- C++类型引用浅析
C++类型引用浅析 引言 从最早被Bjarne Stroustrup 发明,作为C语言的扩展,到广为人知C++98标准,再到最新的C++11.C++14和C++17标准,C++一直在不断地进步.演化. ...
- [POJ1852]Ants
Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12431 Accepted: 5462 Description An a ...
- leetcode之Palindrome Partitioning
方法一:DFS递归,判断每一个是否为回文数 1,首先要有一个判断字符串是否是回文的函数.容易实现,字符串从两边同时往中间走,看字符是否相同; 2,深度优先搜索思想对字符串进行遍历.得到结果.例如,s ...
- spoj 8222 Substrings(后缀自动机+DP)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28005 [题意] 给一个字符串S,令F(x)表示S的所有长度为 ...
- qualcomm platform camera porting
转载自http://www.cnblogs.com/thjfk/p/4086001.html camera基本代码架构 Camera原理:外部光线穿过lens后,经过color filter滤波后照射 ...
- POJ-1981 Circle and Points 单位圆覆盖
题目链接:http://poj.org/problem?id=1981 容易想到直接枚举两个点,然后确定一个圆来枚举,算法复杂度O(n^3). 这题还有O(n^2*lg n)的算法.将每个点扩展为单位 ...
- Miller-Rabin素性测试(POJ3641)
一.概念引入 在以往判断一个数n是不是素数时,我们都是采用i从2到sqrt(n)能否整除n.如果能整除,则n是合数;否则是素数.但是该算法的时间复杂度为O(sqrt(n)),当n较大时,时间性能很差, ...