文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 暴力超时解
    • 2.2 排序+最长上升子序


463 / 3709,前 12.5%

1240 / 9290,前13.3%

1. 题目

给你 n 个长方体 cuboids ,其中第 i 个长方体的长宽高表示为 cuboids[i] = [widthi, lengthi, heighti](下标从 0 开始)。请你从 cuboids 选出一个 子集 ,并将它们堆叠起来。

如果 widthi <= widthj 且 lengthi <= lengthj 且 heighti <= heightj ,你就可以将长方体 i 堆叠在长方体 j 上。你可以通过旋转把长方体的长宽高重新排列,以将它放在另一个长方体上。

返回 堆叠长方体 cuboids 可以得到的 最大高度

示例 1:

输入:cuboids = [[50,45,20],[95,37,53],[45,23,12]]
输出:190
解释:
第 1 个长方体放在底部,53x37 的一面朝下,高度为 95 。
第 0 个长方体放在中间,45x20 的一面朝下,高度为 50 。
第 2 个长方体放在上面,23x12 的一面朝下,高度为 45 。
总高度是 95 + 50 + 45 = 190 。示例 2:
输入:cuboids = [[38,25,45],[76,35,3]]
输出:76
解释:
无法将任何长方体放在另一个上面。
选择第 1 个长方体然后旋转它,使 35x3 的一面朝下,其高度为 76 。示例 3:
输入:cuboids = [[7,11,17],[7,17,11],[11,7,17],[11,17,7],[17,7,11],[17,11,7]]
输出:102
解释:
重新排列长方体后,可以看到所有长方体的尺寸都相同。
你可以把 11x7 的一面朝下,这样它们的高度就是 17 。
堆叠长方体的最大高度为 6 * 17 = 102 。提示:
n == cuboids.length
1 <= n <= 100
1 <= widthi, lengthi, heighti <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-height-by-stacking-cuboids
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 类似题目:
    山谷序列(DP)
    LeetCode 5559. 得到山形数组的最少删除次数(最长上升子序DP nlogn)
    程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)
    LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)
    LeetCode 368. 最大整除子集(DP)
    程序员面试金典 - 面试题 08.13. 堆箱子(DP)
    LeetCode 673. 最长递增子序列的个数(DP)
    LeetCode 1027. 最长等差数列(DP)
    LeetCode 5545. 无矛盾的最佳球队(最大上升子序DP)

2.1 暴力超时解

  • 复杂度太高了,超时
class Solution {public:int maxHeight(vector<vector<int>>& cub) {sort(cub.begin(), cub.end(),[&](auto& a, auto& b){return a[0]+a[1]+a[2] < b[0]+b[1]+b[2];});int n = cub.size();vector<vector<vector<int>>> dp(101,vector<vector<int>>(101, vector<int>(101, -1)));dp[0][0][0] = 0;dp[cub[0][0]][cub[0][1]][cub[0][2]] = max(dp[cub[0][0]][cub[0][1]][cub[0][2]],cub[0][2]);dp[cub[0][0]][cub[0][2]][cub[0][1]] = max(dp[cub[0][0]][cub[0][2]][cub[0][1]],cub[0][1]);dp[cub[0][1]][cub[0][0]][cub[0][2]] = max(dp[cub[0][1]][cub[0][0]][cub[0][2]],cub[0][2]);dp[cub[0][2]][cub[0][0]][cub[0][1]] = max(dp[cub[0][2]][cub[0][0]][cub[0][1]],cub[0][1]);dp[cub[0][1]][cub[0][2]][cub[0][0]] = max(dp[cub[0][1]][cub[0][2]][cub[0][0]],cub[0][0]);dp[cub[0][2]][cub[0][1]][cub[0][0]] = max(dp[cub[0][2]][cub[0][1]][cub[0][0]],cub[0][0]);for(int i = 1; i < n; ++i){vector<vector<vector<int>>> temp(dp.begin(), dp.end());int a = cub[i][0], b = cub[i][1], c = cub[i][2];for(int w = 0; w <= 100; ++w){for(int l = 0; l <= 100; ++l){for(int h = 0; h <= 100; ++h){if(temp[w][l][h] == -1)continue;if(a >= w && b >= l && c >= h)temp[a][b][c] = max(temp[a][b][c], dp[w][l][h]+c);if(b >= w && a >= l && c >= h)temp[b][a][c] = max(temp[b][a][c], dp[w][l][h]+c);if(a >= w && c >= l&& b >= h)temp[a][c][b] = max(temp[a][c][b], dp[w][l][h]+b);if(c >= w && a >= l&& b >= h)temp[c][a][b] = max(temp[c][a][b], dp[w][l][h]+b);if(b >= w && c >=l&& a >= h)temp[b][c][a] = max(temp[b][c][a], dp[w][l][h]+a);if(c >= w && b >=l&& a >= h)temp[c][b][a] = max(temp[c][b][a], dp[w][l][h]+a);}}}dp = temp;}int ans = 0;for(int h = 1; h <= 100; h++)for(int w = 1; w <= 100; ++w){for(int l = 1; l <= 100; ++l){ans = max(ans, dp[w][l][h]);}}return ans;}
};

2.2 排序+最长上升子序

  • 先对每个长方体的长宽高排序
  • 再对所有长方体按照(长宽高)排序
  • 再利用最长上升子序DP
class Solution {public:int maxHeight(vector<vector<int>>& cub) {vector<vector<int>> C(6, vector<int>(3));C[0] = {0,1,2};C[1] = {0,2,1};C[2] = {1,0,2};C[3] = {1,2,0};C[4] = {2,0,1};C[5] = {2,1,0};//最后一维是高度维for(auto& c : cub)sort(c.begin(), c.end());sort(cub.begin(), cub.end());int n = cub.size();vector<vector<int>> dp(n, vector<int>(6, 0));dp[0][0] = cub[0][C[0][2]];dp[0][1] = cub[0][C[1][2]];dp[0][2] = cub[0][C[2][2]];dp[0][3] = cub[0][C[3][2]];dp[0][4] = cub[0][C[4][2]];dp[0][5] = cub[0][C[5][2]];for(int i = 1; i < n; ++i){for(int c1 = 0; c1 < 6; ++c1){dp[i][c1] = cub[i][C[c1][2]];//初始化为自己的高度for(int j = 0; j < i; ++j){for(int c2 = 0; c2 < 6; ++c2){   if(cub[j][C[c2][0]] <= cub[i][C[c1][0]]&& cub[j][C[c2][1]] <= cub[i][C[c1][1]]&& cub[j][C[c2][2]] <= cub[i][C[c1][2]]){dp[i][c1] = max(dp[i][c1], dp[j][c2]+cub[i][C[c1][2]]);}}}}}int ans = 0;for(int i = 0; i < n; i++){for(int k = 0; k < 6; k++){ans = max(ans, dp[i][k]);}}return ans;}
};

332 ms 9.8 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 1691. 堆叠长方体的最大高度(排序+最大上升子序DP)相关推荐

  1. 【1691. 堆叠长方体的最大高度】

    来源:力扣(LeetCode) 描述:   给你 n 个长方体 cuboids ,其中第 i 个长方体的长宽高表示为 cuboids[i] = [widthi, lengthi, heighti](下 ...

  2. LeetCode 1626. 无矛盾的最佳球队(最大上升子序DP)

    文章目录 1. 题目 2. 解题 1. 题目 假设你是球队的经理.对于即将到来的锦标赛,你想组合一支总体得分最高的球队.球队的得分是球队中所有球员的分数 总和 . 然而,球队中的矛盾会限制球员的发挥, ...

  3. LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)

    1. 题目 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现. 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多 ...

  4. LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素. 每一次操作中,你可以在 arr 的任 ...

  5. LeetCode 1671. 得到山形数组的最少删除次数(最长上升子序DP nlogn)

    文章目录 1. 题目 2. 解题 2.1 n^2 解法 2.2 nlogn 解法 197 / 1891,前10.4% 435 / 6154,前7.07% 前三题如下: LeetCode 5557. 最 ...

  6. [算法]LeetCode 专题 -- 二分查找专题 34. 在排序数组中查找元素的第一个和最后一个位置

    LeetCode 专题 – 二分查找专题 34. 在排序数组中查找元素的第一个和最后一个位置 难度:中等 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值 ...

  7. php时间正序排序,列表的时间排序,应该正序还是倒序?

    列表时间排序到底应该正序还是倒序?哪种体验会更好?各大知名产品都是如何做的? 背景 前阵子正好做到了一个类似 " 申请通知 " 的功能,因为涉及到列表,所以要考虑列表的排序规则,那 ...

  8. 《LeetCode力扣练习》第94题 二叉树的中序遍历 Java

    <LeetCode力扣练习>第94题 二叉树的中序遍历 Java 一.资源 题目: 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,nul ...

  9. 树结构练习——排序二叉树的中序遍历(二叉搜索树)

    树结构练习--排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每 ...

最新文章

  1. Java项目:嘟嘟校园一卡通系统(java+JSP+Servlet+html+css+JavaScript+JQuery+Ajax+mysql)
  2. 大数据时代云计算在新媒体平台的应用研究
  3. SEO优化如何让网站关键词排名稳如狗?
  4. t-sql判断一个字符串是否为bigint的函数(全角数字需要判断为不合格)
  5. mips 内存 linux,MIPS 在linux中的内存映射
  6. qtmessagebox对话框里自定义按钮文本_按钮你可以这样设计
  7. 2018.9.15,Arduino—流水灯实验报告
  8. STM32 - 定时器的设定 - 基础 - 05 - Arbitrary waveform generation using timer DMAburst feature - 任意波形的序列产生
  9. 生成主键ID,唯一键id,分布式ID生成器雪花算法代码实现
  10. 弹性地基梁板法计算原理_基础专题
  11. 讯飞输入法pad版x86_讯飞输入法Pad版
  12. 计算机桌面的图片要点开才可以看,在桌面上的图片文件都不显示具体图片了 只能打开这个图片才能看到是哪张图片 请问怎么处理?...
  13. VUCA时代:软件架构解决复杂性之道
  14. Connection could not be established with host smtp.163.com 阿星小栈
  15. Python爬虫任务1
  16. 个人简历管理系统-总结
  17. 病毒乱花迷人眼,勿把“VX”当“全信”
  18. class 和 def
  19. 揭秘:QQ盗号背后的产业链,惊人的暴利!
  20. rsa加解密(兼容微信小程序环境)

热门文章

  1. fish工具_Python程序员使用哪些开发工具
  2. python中错误和异常处理
  3. 3d立体相册特效html网页代码_新闻类网页正文通用抽取器
  4. python 程序打包 vscode_使用VScode编写python程序并打包成.exe文件
  5. 计算abc=a!+b!+c!
  6. 驱动框架8——将驱动集成到内核中
  7. 从集合中选出一些元素组成子集合,使得这些子集合符合某种约束
  8. Android - Glide4.4.0使用
  9. SharePoint 2013的100个新功能之搜索(一)
  10. 使用数据库恢复专家,修复数据库