careercup-递归和动态规划 9.10

简介: 9.10 给你一堆n个箱子,箱子宽w,高h,深d。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。实现一个方法,搭出最高的一堆箱子,箱堆的高度为每个箱子高度的总和。 解法: 要解决此题,我们需要找到不同子问题之间的关系。

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()-1];
    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=0;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=0;
        for(j=0; j<path.size(); j++)
        {
            sum+=path[j].height;
        }
        if(sum>maxHeight)
            maxHeight=sum;
        return;
    }
}
int maxBoxTower(vector<box> &boxes)
{
    vector<box> path;
    int maxHeight=0;
    helper(boxes,path,maxHeight);
    return maxHeight;
}

int main()
{
    vector<box> b= {box(2,2,2),box(1,2,1),box(3,2,1),box(3,3,3)};
    cout<<maxBoxTower(b)<<endl;
}

 

相关文章
素因子分解(递归求解)
素因子分解(递归求解)
134 0
|
6月前
|
存储 算法 数据可视化
LeetCode 题目 97:动态规划、递归到广度优先搜索BFS 实现交错字符串
LeetCode 题目 97:动态规划、递归到广度优先搜索BFS 实现交错字符串
|
7月前
|
搜索推荐 算法 C++
【递归版】归并排序算法(1)
【递归版】归并排序算法(1)
56 0
C#中汉诺塔问题的递归解法
百度测试部2015年10月份的面试题之——汉诺塔。 汉诺塔就是将一摞盘子从一个塔转移到另一个塔的游戏,中间有一个用来过度盘子的辅助塔。 百度百科在此。 游戏试玩在此。 用递归的思想解决汉诺塔问题就是分为两种情况: 第一种情况是只有一个盘子的情况,也就是最基本的情况,这种情况下,直接将该盘子从原始塔转移到目标塔即可胜利; 第二种情况是右n个盘子的情况,也就是普遍情况,这种情况下,要将除了最底下的那个盘子以外的(n-1)个盘子从原始塔转移到辅助塔,再把最底下的那个盘子(第n个盘子)从原始塔转移到目标塔,最后将辅助塔的(n-1)个盘子从辅助塔转移到目标塔。
1847 0
|
机器学习/深度学习 缓存 机器人
从暴力递归到动态规划,记忆化搜索
从暴力递归到动态规划,记忆化搜索
从暴力递归到动态规划,记忆化搜索
循环、递归、分治、回溯、动态规划
循环、递归、分治、回溯、动态规划
129 0
动态规划练习——从暴力递归—>记忆化搜索—>经典动态规划
动态规划练习——从暴力递归—>记忆化搜索—>经典动态规划
|
机器学习/深度学习 算法
一文学会递归解题 | 算法必看系列四
递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google 的 PageRank 算法都能看到,也是面试官很喜欢的考点。
一文学会递归解题 | 算法必看系列四
递归与动态规划
凡是递归的过程,都可以化成树的过程。递归就是问题变成子问题求解的过程。动态规划暂时没明白,好像是需要一张动态规划表,是根据递归搞出来的。 问题1:开始有一头母牛,母牛每年会生一只母牛,新出生的母牛成长三年后也能每年生一只母牛,假设牛都不会死。
697 0
|
C++ 缓存
careercup-递归和动态规划 9.11
9.11 给定一个布尔表达式,由0、1、&、|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式得出result值。 解法: 跟其他递归问题一样,此题的关键在于找出问题与子问题之间的关系。
717 0